空白'For'循环给输出

时间:2013-12-24 14:45:12

标签: c

我在书中遇到了一个奇怪的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循环是如何执行的吗?

3 个答案:

答案 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):

  1. 不要使用for (;;) {} - 它会使声明失效。
  2. 当然,除非你#define EVER ;;