为什么(;;)循环的行为类似于无限循环?

时间:2016-10-01 17:06:30

标签: c for-loop language-lawyer

最近关于for(;;){}循环(What does a for (;;) loop do)的问题的答案似乎没有回答我的问题,所以我想我会尝试稍微改进一下这个问题。特别是,除了知道没有条件的for循环是无限循环之外,我想知道为什么它们是无限循环。

for (;_;){}语句中,_是一个条件表达式。我的第一个猜测是空表达式可能会评估为0NULL。但如果你测试:

for (;;){}
正如大家所指出的,

是一个无限循环。

for (;1;){}

是一个无限循环。

但这些循环体都没有执行:

for (;0;){}
for (;NULL;){}

因此,空条件表达式似乎不会评估为0NULL

所以,我的问题:for (;;){}循环的行为是C计算表达式的方式的工件,还是只是一个特殊的实现定义的情况,因为从不执行的循环体不是很有用吗?

更新: 在阅读了评论和答案后,我意识到我的问题并没有像过去那样明确。我想问题是双重的:

  1. for(;;){}的行为是否严格地是C一般评估表达式的方式的结果,还是这种行为特定于C评估for语句的方式?

  2. 为什么为缺少条件表达式的for循环选择了这种行为?

2 个答案:

答案 0 :(得分:19)

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)

答案 1 :(得分:0)

条件表达式检查是否要继续循环,是,并且循环的默认函数是..循环。如果它不是具有空测试表达式的特殊情况并且在这种情况下继续循环,那么它将是相反的情况(正如您已经注意到的)并且中止循环使得整个for语句不那么强大甚至是多余的。

此处使用的技术称为合理/合理的默认值。