为什么(;;)循环表现得像无限循环?

ex *_*ilo 6 c for-loop language-lawyer

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

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

for (;;){}
Run Code Online (Sandbox Code Playgroud)

每个人都指出,这是一个无限循环.

for (;1;){}
Run Code Online (Sandbox Code Playgroud)

是一个无限循环.

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

for (;0;){}
for (;NULL;){}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Lig*_*ica 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
Run Code Online (Sandbox Code Playgroud)

相当于

{
   for-init-statement
   while ( condition ) {
      statement
      expression ;
   }
}
Run Code Online (Sandbox Code Playgroud)

[..]

[C++14: 6.5.3/2]:可以省略条件和表达式中的任何一个或两者.缺失条件使隐含while条款等效于while(true).