不编写表达式时,for循环如何工作。例如
int i=0 , j=1;
for(;;)
答案 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循环的所有部分都是可选的:
for(;;)
是一个无限循环(如果该循环中没有break
的话)。
答案 2 :(得分:2)
不存在的表达式不起作用。
如果没有初始化,则不会初始化任何东西。
如果不进行测试,则不会进行任何测试(除非主体包含break
,return
等,否则主体会永远循环)
如果不增加,则什么也不会增加。
答案 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
循环都是无限循环。
break
,return
和goto
基本上有三种摆脱无限循环的方法。
在大多数情况下,您应该使用break
或return
,但是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
不是无符号的,则算术溢出将导致未定义的行为,这很糟糕:循环可能会无限期地停止或继续,具体取决于编译器的选择,否则可能会发生其他情况。