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).
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循环的所有迭代定义一次.