混淆while和for循环的变量范围(C编程)

时间:2011-10-12 14:38:54

标签: c variables for-loop while-loop scope

今天在我编码的时候,我遇到了一些我不希望以这种方式发生的事情.Below只是这个问题的一个示例代码。

守则1

while(true)
{
 int i = 1;

 printf("This is %d\n" , i);
 ++i;
 if(i == 10)
   break;
}

守则2

for(int i = 1 ; ; i++)
{
 printf("This is %d\n" , i);
 if(i == 10)
    break;
}

问题:

1.)第一个代码会导致无限循环,而后者则不会。

2.)我不明白,内部有一个标准的提及变量声明,而while循环中的任何语句都可以访问循环,但为什么if()无法访问变量i的值后者可以??

感谢您花时间阅读我的问题

3 个答案:

答案 0 :(得分:11)

这很简单:

for(int i = 1 ; ; i++)
{
    printf("This is %d\n" , i);
    if (i == 10)
        break;
}

相当于

{
    int i = 1;
    while (true)
    {
        printf("This is %d\n" , i);
        if (i == 10)
            break;
        i++;
    }
}

即,int i = 1部分在for - 循环的第一次迭代之前执行for引入了一个隐式的额外范围块,其中包含X for (X;Y;Z)中声明的所有变量。

答案 1 :(得分:6)

C具有块范围的概念。在给定范围内声明的变量具有与该范围等效的生命周期。在while循环的情况下,这意味着循环的每次迭代都有一个i变量。每次循环重新启动时,它都会创建一个新的i并将其值设置为1i++仅在该实例上评估一次,因此它永远不会到达10并且确实会无限循环。

只需在i之前移动while loop即可修复第一个代码示例。

int i = 1;
while (true) {
  printf("This is %d\n" , i);
  ++i;
  if(i == 10)
    break;
}

现在i在外部范围内声明,因此i循环的所有迭代都会有一个while

for循环案例的作用几乎相同。在for循环中声明的迭代变量为循环的所有迭代定义一次。

答案 2 :(得分:1)

问题在于,在你的while循环中,你不仅要宣告我,而且要初始化它。因此,在每次循环迭代中,我都会重置为1,从而导致无限循环。

for循环在开始循环之前首先初始化i = 1,所以它更像是像这样写一个while循环:

int i = 1;
while (true)
{
    printf("This is %d\n" , i);
    if (i == 10) break;
    i++;
}