为什么(;;)循环表现得像无限循环?
关于for(;;){}
循环的最近问题的答案( 对于(;;)循环做什么 )似乎没有回答我的问题,所以我想我会尝试稍微改进一下这个问题。 特别是,除了知道没有条件的for
循环是无限循环之外,我想知道为什么它们是无限循环。
在for (;_;){}
的语句for (;_;){}
, _
是一个条件表达式。 我的第一个猜测是空表达式可能会计算为0
或NULL
。 但如果你测试:
for (;;){}
每个人都指出,这是一个无限循环。
for (;1;){}
是一个无限循环。
但是这些循环体都没有执行:
for (;0;){} for (;NULL;){}
因此,空条件表达式似乎不会计算为0
或NULL
。
所以,我的问题是: for (;;){}
循环的行为是C计算表达式的方式的工件,还是只是一个特殊的实现定义的情况,因为从不执行的循环体不是很有用?
更新:在阅读了评论和答案后,我意识到我的问题并没有像过去那样明确。 我想问题是双重的:
-
for(;;){}
的行为是否严格地是C一般评估表达式的方式的结果,或者这种行为是否特定于C计算语句的方式? 事实certificate,这些替代方案中的第二种是这种情况,经过进一步的反思,这才有意义。 通常,缺少的表达式会触发编译器错误。 例如,while(){}
将无法编译。 -
为什么
for
缺少条件表达式的for
循环选择了这种行为? 我最初建议使用一个永不执行的主体的for
循环并不是很有用。 但是对我而言,如果你错误地将条件从你的for
语句中删除,根据标准的规则,你的程序可能会崩溃到一个无限循环。 这可能是令人惊讶的,但至少你知道它崩溃的地方。 但如果替代行为是规则,你的程序将跳过for
的主体,可能会导致一些非常令人讨厌的惊喜谁知道在哪里。 因此,应用最小意外原则,无限循环行为更为可取。 正如@martin指出的那样,这只是for
循环的合理默认值。
谢谢大家的意见和答案,并帮助我为自己澄清我的问题。
C和C ++都保证了这种行为。
[C99: 6.8.5.3/1]:
可以省略子句-1和表达式3 。 省略的表达式-2由非零常量替换。
[C++14: 6.5.3/1]:
for
语句for ( for-init-statement conditionopt; expressionopt) statement
相当于
{ for-init-statement while ( condition ) { statement expression ; } }
[..]
[C++14: 6.5.3/2]:
可以省略条件和表达式中的任何一个或两个。 缺失条件使隐含的while
子句等同于while(true)
。
条件表达式检查循环是否继续 ,是,并且循环的默认函数是..循环。 如果它不是具有空测试表达式的特殊情况并且在这种情况下继续循环,那么它将是相反的情况(正如您已经注意到的)并且中止循环,这使得整个for
语句不那么强大甚至是冗余。
这里使用的技术称为合理/合理的默认值。