【发布时间】:2016-10-01 17:06:29
【问题描述】:
最近关于 for(;;){} 循环 (What does a for (;;) loop do) 的问题的答案似乎没有为我解答,所以我想我会尝试稍微改进一下这个问题。特别是,除了知道for不带条件的循环是无限循环之外,我还想知道为什么它们是无限循环。
在语句for (;_;){} 中,_ 是一个条件表达式。我的第一个猜测是空表达式的计算结果可能为0 或NULL。但如果你测试:
for (;;){}
正如大家所指出的那样,是一个无限循环。
for (;1;){}
是一个无限循环。
但是这些循环体都没有执行:
for (;0;){}
for (;NULL;){}
因此,空条件表达式的计算结果似乎不是0 或NULL。
所以,我的问题是:for (;;){} 循环的行为是 C 评估表达式的方式的产物,还是只是一个特殊的实现定义的情况,因为从不执行的循环体不是很有用?
更新: 在阅读了 cmets 和答案之后,我意识到我的问题并没有像它可能的那样清楚地表达出来。我想这个问题有两个方面:
for(;;){}循环的行为是 C 对一般表达式求值方式的严格结果,还是这种行为特定于 C 对for语句求值的方式?为什么为缺少条件表达式的
for循环选择此行为?
【问题讨论】:
-
你能想出一个更具描述性的问题标题吗?理想情况下,标题应该可以帮助其他有相同问题的人在未来到达这里。
-
“我的第一个猜测是空表达式可能会计算为
0或NULL” - 为什么? C 和 C++ 都没有“空表达式”这样的概念。这立即意味着代替for条件的空白空间需要特殊处理,这在for的行为规范中给出。 -
“不清楚你在问什么”哈哈!
-
我只是想知道 C 中的预期表达式是否有默认值。@tobi 提出了一个你不能写的好点,例如
while();,或者编译器给出 "error: expected expression ..." 。所以也许我应该知道这将特定于'for()'。只是想再深入一点。
标签: c for-loop language-lawyer