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

car*_*995 4 c variables scope for-loop while-loop

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

守则1

while(true)
{
 int i = 1;

 printf("This is %d\n" , i);
 ++i;
 if(i == 10)
   break;
}
Run Code Online (Sandbox Code Playgroud)

守则2

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

问题:

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

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

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

Fre*_*Foo 11

这很简单:

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

相当于

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

即,该int i = 1部分在-loop 的第一次迭代之前执行for.for引入一个隐含的额外范围块,包含在Xof中声明的任何变量for (X;Y;Z).


Jar*_*Par 6

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

只需移动i前面的第一个代码示例就可以修复while loop.

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

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

for循环的情况下适用于几乎相同的原因.循环中声明的迭代变量为for循环的所有迭代定义一次.