【问题标题】:Why do for(;;) loops behave like infinite loops?为什么 for(;;) 循环表现得像无限循环?
【发布时间】:2016-10-01 17:06:29
【问题描述】:

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

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

for (;;){}

正如大家所指出的那样,是一个无限循环。

for (;1;){}

是一个无限循环。

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

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

因此,空条件表达式的计算结果似乎不是0NULL

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

更新: 在阅读了 cmets 和答案之后,我意识到我的问题并没有像它可能的那样清楚地表达出来。我想这个问题有两个方面:

  1. for(;;){} 循环的行为是 C 对一般表达式求值方式的严格结果,还是这种行为特定于 C 对 for 语句求值的方式?

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

【问题讨论】:

  • 你能想出一个更具描述性的问题标题吗?理想情况下,标题应该可以帮助其他有相同问题的人在未来到达这里。
  • “我的第一个猜测是空表达式可能会计算为0NULL” - 为什么? C 和 C++ 都没有“空表达式”这样的概念。这立即意味着代替for 条件的空白空间需要特殊处理,这在for 的行为规范中给出。
  • “不清楚你在问什么”哈哈!
  • 我只是想知道 C 中的预期表达式是否有默认值。@tobi 提出了一个你不能写的好点,例如while();,或者编译器给出 "error: expected expression ..." 。所以也许我应该知道这将特定于'for()'。只是想再深入一点。

标签: c for-loop language-lawyer


【解决方案1】:

C 和 C++ 都保证这种行为。


[C99: 6.8.5.3/1]: clause-1expression-3 都可以省略。省略的 expression-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)

【讨论】:

    【解决方案2】:

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

    这里使用的技术称为合理/合理的默认值。

    【讨论】:

    • 感谢您解决这部分问题。请参阅我对原始问题的更新。
    • 是的。我花了一点时间来理解你在那里看到的特别之处(并且你的观察是正确的),当时我已经知道我会被否决,因为不是每个人都花时间。 ;)
    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多