内部如何解析for循环

时间:2018-08-20 18:27:22

标签: c for-loop

不编写表达式时,for循环如何工作。例如

int i=0 , j=1;
for(;;)

4 个答案:

答案 0 :(得分:5)

缺少中间表达式的for循环是无限循环。

摘自C standard的6.8.5.3节:

  

1 语句

for ( clause-1 ; expression-2 ; expression-3 ) statement
     

表现如下:表达式expression-2是控制   在每次执行循环主体之前求值的表达式。   表达式expression-3在之后被评估为无效表达式   循环体的每次执行。如果第1条是声明,则   它声明的所有标识符的范围是   声明和整个循环,包括其他两个表达式;   在第一次评估之前按执行顺序达到   控制表达式。如果子句1是表达式,则为   在第一次评估之前被评估为无效表达式   控制表情。

     

2 子句1和表达式3都可以省略。 省略的expression-2替换为非零常量。

因为缺少的“ expression-2”被非零常量替换,并且由于非零值的计算结果为true,所以这会导致无限循环。

答案 1 :(得分:3)

for循环的所有部分都是可选的:

  • 初始化:您可以在循环外部进行初始化。
  • 条件:如果为空,则为true
  • 最后一部分:您也无能为力。

for(;;)是一个无限循环(如果该循环中没有break的话)。

答案 2 :(得分:2)

不存在的表达式不起作用。

如果没有初始化,则不会初始化任何东西。

如果不进行测试,则不会进行任何测试(除非主体包含breakreturn等,否则主体会永远循环)

如果不增加,则什么也不会增加。

答案 3 :(得分:2)

for循环包含三个子句。它们实际上可以是任何表达式,但是使用它的标准方法是for(<init>; <loop condition>; <loop variable increment>)。所有这些都是可选的:如果省略循环条件,它将被评估为true的常量替代。例如,您可以替换

for(int i=0; i<10; i++) {
   ...
}

使用

for(int i=0; i<10; ) {
    ...
    i++;
}

for(;;)是一个无限循环。省略第二条语句的任何for循环都是无限循环。

breakreturngoto基本上有三种摆脱无限循环的方法。

在大多数情况下,您应该使用breakreturn,但是goto也有其用法。

  • 如果您只想跳出循环然后继续,请使用break

  • 如果要退出包含循环的函数,请使用return。但是,这可能是一种不好的做法,因为它可能会违反“单出口”做法。

  • 如果您想退出嵌套循环,可以使用goto。

是的,您可以通过调用exit()退出循环,或者直接使程序崩溃,但是我想您明白了。

评论问题

  

for(i <2; i ++;)

这没有多大意义。第一个表达式i<2不会影响任何内容,并且很可能会被编译器优化。如果i++i,则第二个表达式0的计算结果为false:

  • 如果i的初始值为0,则完全不评估循环体。

  • 如果i最初是负数。循环进行迭代,直到i达到值0,最后一次迭代以i == 0发生,并且下一个测试将结束循环。

  • 如果i具有unsigned类型并且大于0。循环进行迭代,直到i达到其类型的最大值并包装为0,最后一次迭代以i == 0发生,并且下一个测试停止循环。如果i不是无符号的,则算术溢出将导致未定义的行为,这很糟糕:循环可能会无限期地停止或继续,具体取决于编译器的选择,否则可能会发生其他情况。