108

回到我的 C/C++ 时代,将“无限循环”编码为

while (true)

感觉更自然,对我来说似乎更明显,而不是

for (;;)

在 1980 年代后期与PC-lint的相遇以及随后的最佳实践讨论打破了我的这种习惯。我已经使用for控制语句对循环进行了编码。今天,很长一段时间以来第一次,也许是我作为 C# 开发人员第一次需要无限循环,我面临着同样的情况。其中一个正确而另一个不正确吗?

4

20 回答 20

337

C# 编译器将转换两者

for(;;)
{
    // ...
}

while (true)
{
    // ...
}

进入

{
    :label
    // ...
    goto label;
}

两者的 CIL 相同。大多数人发现while(true)更容易阅读和理解。for(;;)是相当神秘的。

来源:

我在.NET Reflector上搞砸了一些,我在 Visual Studio 中使用“优化代码”编译了两个循环。

两个循环都编译成(使用 .NET Reflector):

Label_0000:
    goto Label_0000;

猛龙队应该很快进攻。

于 2009-09-09T18:14:01.837 回答
131
while(true)
{

}

始终是我使用过的以及我看到其他人使用的必须手动破坏的循环。

于 2009-09-09T18:08:14.563 回答
61

我认为这可能更容易阅读,并且绝对是 C# 中使用的标准:

while(true)
{
   //Do My Loop Stuff
}
于 2009-09-09T18:07:50.663 回答
53

喘气,使用:

while (!false)
{

}

或者正如jsight指出的那样,您可能需要加倍确定:

while (!false && true)
{
}

在人们对我大喊大叫之前,我检查了所有相同的 CIL 代码:)

于 2009-09-09T18:14:40.210 回答
38

重温几个老笑话:

  1. 不要使用“ for (;;) {}”——这会使声明哭泣。
  2. 当然,除非你“ #define EVER ;;”。
于 2009-09-09T18:13:59.980 回答
27

如果你想去老学校,C# 仍然支持 goto:

STARTOVER:  
    //Do something
    goto STARTOVER;

对于真正的无限循环,这是首选命令。=)

于 2009-09-09T18:32:04.250 回答
21

我认为while (true)更具可读性。

于 2009-09-09T18:07:48.980 回答
10

在需要真正无限循环的情况下,我一直使用

while(true) {...}

它似乎比空的 for 语句更能表达意图。

于 2009-09-09T18:08:52.360 回答
10

就个人而言,我一直更喜欢for(;;)它,因为它没有条件(相对于while (true)它有一个永远为真的条件)。然而,这确实是一个非常次要的风格点,我觉得这两种方式都不值得争论。我还没有看到强制或禁止任何一种方法的 C# 样式指南。

于 2009-09-09T18:14:48.793 回答
7

C的原始K&R书籍,C# 可以从中追溯它的祖先,推荐

for (;;) ...

对于无限循环。它毫不含糊,易于阅读,背后有着悠久而崇高的历史。

附录 (2017 年 2 月)

当然,如果您认为这种循环形式(或任何其他形式)过于神秘,您可以随时添加评论

// Infinite loop
for (;;)
    ...

或者:

for (;;)    // Loop forever
    ...
于 2009-09-09T18:41:45.900 回答
6

我个人更喜欢这个for (;;)成语(从 C/C++ 的角度来看)。虽然我同意它while (true)在某种意义上更具可读性(即使在 C/C++ 中也是我使用的方式),但我已经转向使用该for成语,因为:

  • 它脱颖而出

我认为循环不会终止(以正常方式)这一事实值得“大声疾呼”,而且我认为这样for (;;)做更多。

于 2009-09-09T18:17:41.363 回答
4

它应该while(true)不是while(1),所以while(1)在 C# 中是不正确的,是的;)

于 2009-09-09T18:09:49.537 回答
3

或者,可以说拥有无限循环通常是不好的做法,因为它需要退出条件,除非应用程序真的永远运行。但是,如果这是用于巡航导弹,我将接受可能不需要明确的退出条件。

虽然我喜欢这个:

for (float f = 16777216f; f < 16777217f; f++) { } 
于 2009-09-09T18:24:15.990 回答
2

我更喜欢“有文化”的代码。在实践中,我更有可能做这样的事情:

bool shouldContinue = true;
while (shouldContinue)
{
    // ...

    shouldContinue = CheckSomething();
}
于 2009-09-09T18:34:27.490 回答
2

即使我也说下面的更好:)

while(true)
{

}
于 2009-09-09T19:03:04.523 回答
1

while(true)就我认为更有意义的任何语言的代码可读性而言。就计算机如何看待它而言,在当今非常高效的编译器和解释器的社会中确实不应该有任何区别。

如果有任何性能差异,我确信转换为 MSIL 会优化掉。如果你真的想要,你可以检查一下。

于 2009-09-09T18:10:10.957 回答
1

我要说的唯一原因for(;;)是由于 CodeDom 的限制(不能使用 CodeDom 声明 while 循环,而 for 循环被视为迭代循环的更一般形式)。

for除了循环实现既可用于普通代码也可用于 CodeDom 生成的代码这一事实之外,这是选择它的一个非常宽松的理由。也就是说,它可以更标准。

请注意,您可以使用代码片段来创建while循环,但整个循环需要是一个片段......

于 2009-09-09T18:10:52.047 回答
1

如果你在打代码,我建议for(;;). 除此之外,while(true)具有相同的含义并且看起来更直观。无论如何,大多数编码人员可能会理解这两种变化,所以这并不重要。使用最舒适的。

于 2009-09-15T23:55:28.017 回答
1

两者功能相同,但人们普遍偏爱while(true). 感觉很容易阅读和理解...

于 2010-12-04T09:33:46.270 回答
0

对于 while 循环,任何始终返回 true 的表达式都应该是可以的。

例子:

1==1 //Just an example for the text stated before 
true
于 2009-09-09T18:28:00.500 回答