我在书中遇到了一个奇怪的FOR LOOP
问题。这是循环的代码 -
#include<stdio.h>
int main()
{
int i=1,j=1;
for(;;)
{
if(i>5)
break;
else
j+=i;
printf("%d\n",j);
i+=j;
}
return 0;
}
该程序打印2
&amp; 5
作为输出。现在有人可以解释这个for
循环是如何执行的吗?
答案 0 :(得分:2)
for循环是非终止循环的经典习语。当你想要一个永不终止的循环,或者它的终止由循环内的控制流语句控制时,你会使用它。后者就是这种情况。
for(;;)
for
循环的所有部分都是空的。它们是理解为什么它是非终止循环的关键是for
语句中的空控制表达式。
标准( 6.8.5.3 for statement )说明了我的重点:
声明
for ( clause-1 ; expression-2 ; expression-3 ) statement
表现如下:表达式表达式-2是控制 在每次执行循环体之前计算的表达式。 表达式-3被评估为之后的空表达式 循环体的每次执行。如果第1条是声明,那么 它声明的任何标识符的范围是其余的 声明和整个循环,包括其他两个表达式; 它是在第一次评估之前按执行顺序到达的 控制表达。如果子句-1是表达式,那么它是 在第一次评估之前评估为空表达式 控制表达.158)
可以省略子句-1和表达式-3。 省略 expression-2被非零常量替换。
这意味着由于for
语句的控制表达式部分,您的循环永远不会终止。
答案 1 :(得分:2)
for(;;)
是一个for
循环,它不执行初始化,没有退出条件且不执行任何后续操作。
除非循环中的代码包含可能导致调用break
的条件,否则它将永远循环。
你的循环等同于
int i,j;
for(i=1, j=1 ;i<=5 ;i+=j) {
j+=i;
printf("%d\n",j);
}
答案 2 :(得分:2)
for(;;)
相当于while(true)
(或旧版C中的while(1)
),其终止只受其中的陈述控制。
修改强>: 重复几句旧笑话(借鉴here):
for (;;) {}
- 它会使声明失效。#define EVER ;;
。