“for(;true;)”和“while(true)”有什么不同吗?

10

如果我的理解是正确的,它们做的事情完全相同。为什么有人要使用“for”变体?只是个人喜好吗?

编辑:我想我也考虑到了“for (;;)”。

8个回答

40
for (;;)

常用于避免编译器警告:

while(1)
或者
while(true)

通常在最高警告级别下,会对条件表达式为常量进行编译器警告。


8
是的,这只是口味问题。

2
我不明白为什么这个回答会被投票否决。它并不是一个很好的答案,但确实正确回答了问题。 - Paul Tomblin

6

我从未见过for (;true;)。我见过for (;;),唯一的区别似乎只是口味不同。我发现C程序员略微偏爱for (;;)而不是while (1),但这仅仅是个人偏好。


也许,我想的是两个分号 (;;)。 - Sydius
我一直使用 while(1)。我曾经和一个人一起工作,他更喜欢 do{...}while(1); 因为他认为这样更清晰,你总是从循环开始,但可能会在中途退出。他没有说服我。 - Paul Tomblin
如果我总是需要运行一次,我会一直使用 do..while 循环。 - warren
while (true) 确保 你几乎只运行它一次。true 始终为真 :) - Daniel Daranas

4

这不是一个答案,而是一条注释:有时候记住for(;x;)和while(x)等价(换句话说,当我检查if条件语句的中心表达式时只说“while”),可以帮助我分析棘手的for语句…


例如,它使得明显的是,在循环的第一轮中心表达式总是在开头被计算,有些情况下我们可能会忘记这点,但是当你用while()格式查看时就完全没有歧义了。

有时候记住这一点也是很方便的。

a;
while(b) {
   ...
   c;
}

几乎(见评论)与

相同
for(a;b;c) {
    ...
}

我知道这很显而易见,但积极意识到这种关系确实有助于您快速在两种形式之间转换,以澄清令人困惑的代码。


好的解释。我认为一些C++开发者可能会惊讶于你最后的例子是等价的。 - Daniel Daranas
4
它们不完全相同:continue语句会导致在for循环变体中执行'c',而在while循环变体中'c'不会被执行。 - Adam Rosenfield
@adam 好观点——我知道有些微妙的东西我忘了,我其实有点担心它不是那么微妙 :) - Bill K
另一个不同之处在于,你的 while 示例中的 c 可能引用了代码块内的变量。它应该改为:{ a; while(b) { { ... } c; } } - jpalecek

3
一些编译器(开启了警告)可能会抱怨while(true)是一个永远不会失败的条件语句,而它们对for (;;)则感到满意。因此,我更喜欢使用for (;;)作为无限循环的习惯用法,但我认为这并不是个大问题。

1

这是为了以后可能会使用真正的for()循环而做的准备。如果你看到for(;true;),那么它很可能是用于调试的代码。


0
一个优化编译器应该为它们生成相同的汇编代码——一个无限循环。

0
编译器警告已经讨论过了,所以我会从语义的角度来解释。我使用while(TRUE)而不是for(;;),因为在我看来,while(TRUE)听起来比for(;;)更有意义。我把while(TRUE)读作“当TRUE始终为TRUE时”。就个人而言,这提高了代码的可读性。
所以,如果我没有记录我的代码(当然,这永远不会发生),它仍然比替代方案更易读一些。
但总的来说,这是一个非常吹毛求疵的事情,99%的时间都取决于个人喜好。

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