【问题标题】:c++ declaration and initialization variables inside while loopsc++ 在while循环中声明和初始化变量
【发布时间】:2017-07-20 23:19:51
【问题描述】:
在以下代码中:
#include <iostream>
using namespace std;
int main()
{
int num = 0;
while (num >= 0 && num <= 3)
{
int inner_loop_count = 0;
cout << "Loop # " << ++inner_loop_count << "\n";
num++;
}
}
输出是:
循环 #1
循环 #1
循环 #1
循环#1
我的理解是循环作用域在大括号{}之间,不能用来定义循环计数器,因为每次都会重做声明和初始化。
我尝试了以下解决方案:
- 使用静态关键字。 (无论好坏)。
- 将 while 本身包含在外部 {} 中,并在 while 之前声明计数器变量。
问题 #1: 我的理解正确吗?
问题 #2: 还有其他的技术上可行的解决方案吗?
谢谢
【问题讨论】:
标签:
c++
loops
while-loop
initialization
declaration
【解决方案1】:
你的理解是正确的。另一种可能的解决方案是使用for 循环:
using namespace std;
int main()
{
for(int num = 0, inner_loop_count = 1; num <=3; num++, inner_loop_count++)
{
cout << "Loop # " << inner_loop_count << "\n";
}
return 0;
}
【解决方案2】:
A1。是的,你的理解是正确的。自动变量是其块的本地变量(由{} 分隔),因此如果在循环体中声明,它不能用作循环计数器。
A2。您的 2. 建议是在 while 循环中使用计数器的典型方法,尽管通常不需要用外部块隔离计数器。另一种可能性:for 循环控制结构,其作用完全相同,但语法不同(即它是语法糖)。
此外,您可以使用全局变量 - 这与使用局部静态变量非常相似。
【解决方案3】:
我的理解是循环作用域在大括号{}之间,不能用来定义循环计数器,因为每次都会重做声明和初始化。
你是对的
您可以像这样在 while 循环之外声明您的计数器:
int inner_loop_count = 0;
while (num >= 0 && num <= 3)
{
cout << "Loop # " << ++inner_loop_count << "\n"; //beware..Counts +1 before loop is done. First looping will count as 1, but is actually number 0
num++;
}
【解决方案4】:
您实际上无法在循环体内定义循环计数器。正如您所提到的,static 可以在给定的上下文中在技术上工作。但是如果第二次进入循环,计数器就不会从 0 开始。
因此,请改用for 循环。
这就是它的“目的”:
for( int num = 0; num <= 3; ++num )
{
// ...
}
它是由与 while 循环等效定义的,该循环放置在放置 int num = 0 声明的封闭大括号块中。
更新 ++num 被放置在循环体的底部,如下所示:
// Equivalent:
{
int num = 0;
while( num <= 3 )
{
// ...
++num;
}
}
...您可以避免使用for 编写。
【解决方案5】:
您的理解是正确的,另一种可能的解决方案是在循环之外声明变量:
int inner_loop_count = 0;
while (num >= 0 && num <= 3)
{