今天在我编码的时候,我遇到了一些我不希望以这种方式发生的事情.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的值后者可以??
感谢您花时间阅读我的问题
答案 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
并将其值设置为1
。 i++
仅在该实例上评估一次,因此它永远不会到达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++;
}