"for(;;)" 的目的是什么?

3
在一个旧的代码库中,我发现了以下片段:
for(;;){
  // code that manipulates a vector 'vec'
  if(vec.empty()) break;
}

除了各自作者的个人口味之外,使用for(;;)而不是while(true)背后是否有任何目的或约定?


然后还有这个 https://dev59.com/dEXRa4cB1Zd3GeqPs5Jo - StoryTeller - Unslander Monica
有些人喜欢这样写程序 #define EVER ;;,然后使用 for(EVER) :) - NathanOliver
3
我记得在某个编译器中,使用 while (true) 会提示条件基于常量表达式(或类似内容)而发出警告,而使用 for (;;) 则不会。请注意,我的翻译尽量保持原意并使语言更加通俗易懂。 - Algirdas Preidžius
3
规范化的链接:https://dev59.com/4GIj5IYBdhLWcg3whFQH - Hans Passant
2个回答

9

旧的C++编译器对于for(;;)语法不会发出警告,但对于while(true)则会。同样的情况也适用于C语言中的while(1)

因此形成了这样的约定惯例。


1
有趣的是,可能是从更复杂的表达式中“继承”了一些“条件始终为真”的警告,并没有像完全空的条件(仅适用于for)那样给出特殊情况。 - Lightness Races in Orbit
1
我不确定对于这样的编译器,什么应该构成一个错误修复。 - StoryTeller - Unslander Monica
1
这是一个很好的历史视角。如果你补充说明这些语句在语义上是等价的,不考虑质量问题,我就会删掉我的回答作为冗余。 - Lightness Races in Orbit
根据Hans Passant在评论中提供的被接受的答案,for(;;)是合法代码的原因是空的第二个表达式被替换为非零常数。假定进行该替换的编译器认为这是程序员有意为之,这就是为什么没有发出诊断的原因。 - Tim Randall
@TimRandall:我认为这比那简单:在“for”循环中的“表达式”(或者现在称之为什么)可以选择存在或不存在,从而导致8种不同的可能性。决定哪些组合会产生警告将是繁琐的,特别是在旧时代。 - Bathsheba
@Bathsheba可能是。目前我看不出这些理论之间有什么显著的区别。 - Tim Randall

3

不。

这只是个人口味而已。

它完全相当于一个while (true)循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接