为什么我看到这么多的for(;;)构造?[关闭]


14

按照我的想法,for循环用于迭代已知或可确定的范围。

String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }

这等效于(除i之外):

String[] names = //something;
int i = 0;
while (i < names.length )
{
   // do stuff
   i++;
}

换句话说,for对于常用的while构建体,循环只是一种(非常有用的)语法糖。

但是,我在网络上看到很多for(;;)在功能上等同于while(true)

这是什么原因呢?为什么无限for循环比无限while循环更受青睐?

//我什至看到一本完全没有使用while循环的java教科书!导致如下可怕的构造:

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}

主要原因是偏好。选择YMMV时,可读性应发挥作用。
亚伦·麦克弗

为什么有人会喜欢笨拙的构造?
克里斯·库德莫

10
您可以在此处交换内容whilefor问题不会改变。while(true)并且for(;;)意思是一样的。您显然对某人有强烈的偏好while,别人可能也同样有强烈的偏好for。不可能说一个比另一个更正确。
Caleb

3
@chris,我一点都没有感到for(;;)困惑。这是一个标准的C习语,您将在K&R(2e)的3.5节中进行记录。我了解不喜欢它;应该了解其他人显然更喜欢它(否则您将永远看不到它)。它可能或多或少地接受C语言以外的语言;您已将此语言标记为与语言无关,这只会降低确定答案的可能性。再次,我投票决定关闭,因为Q不是建设性的。如果我被冒犯了,我会被标记为进攻而不是结束。就这些。
Caleb

1
我个人认为这是一个真正的机会,可以为无限循环完全使用另一种语法:就像wheeeeeeee { ... }
2011年

Answers:


33

这是对PDP-11上旧编程实践的保留(是的,我说过old)。它过去只保存一条指令,这对于使循环运行得更快非常有用。

有关其他信息,请参见以下内容:http : //www.flounder.com/exceptions.htm


3
那正是我想要的。存在真实,合理的理由,但不再有效。
克里斯·库德莫

1
@chris Nnnope,现代编译器有时会抱怨在循环条件下使用常量。这不只是一个保留。
2011年

不仅如此。我记得在1990年代早期在unix系统上编写C,而while(true){}则不是一种选择。没有标准的布尔类型,但是几个UNIX系统在C头文件中定义了自己的类型。从内存中至少有一个unix供应商将TRUE正确地定义为零,以辅助处理函数返回,因为惯例是成功时返回零,而正数表示失败。这确实意味着while(TRUE){}是不可移植的。
迈克尔·肖

1
我现在找不到它,但是我可以发誓,几年前,Dennis Ritchie在Usenet上写了一篇文章,指出这根本是错误的,并且for(;;)(他们认为)语法是(更直接地)声明了目的是没有说明退出循环的标准。
杰里·科芬

@托勒密:嗯,您当然可以写的while(1) { }
Ed S.

10

有些编译器在使用时会发出警告(类似条件表达式是常量),while( 1 )for( ; ; )没有任何警告。程序员想要没有警告的代码,因此他们使用for变体。


但是,编译器警告的某些事情是完全有效的,甚至(在某些特殊情况下)不可避免。因此,我们中的一些人将警告视为警告。如果您忽略它们,那么您当然会陷入该死的事物之中,而看不到重要的事物-但是有一些实用程序和选项可以在本地或全局禁用警告。基本上,是的,最好不要显示警告,但是我通常需要一个更强大的理由,而不是采用更差的代码样式。在这里,情况有所不同,但并不更糟,但是“无限”循环无论如何都是罕见的(或者非常糟糕的风格)。
Steve314

5

这是从C编程获得的一种习惯,其中没有布尔类型。虽然(1)可能是等效的,但如果我没记错的话,经常使用For(;;),因为它在K&R中显示出来。我怀疑那里也有硬件原因。


4
...怀疑有一个硬件的原因...
亚伦·麦基弗

2
正如爱德华·罗伯森(Edward Robertson)所提到的,原因是因为PDP-11上的C编译器没有意识到“ while(true)”中的true是编译时间常数,并且在生成程序集时会添加一条额外的指令(比较)。由于PDP-11上可用的资源有限,程序员使用了for循环来优化程序中的另一条指令。
杰蒂2011年

3

for(;;)可以被理解为“永远”,有些人会发现它比“ while true”更为自然。


虽然这不是最初的原因,但这是次要原因,即在原始原因过时之后,偏好仍然存在。但是,除了询问经验丰富的程序员之外,很难提供任何证据来支持这一点。
2011年

-2

我要求的所有有经验的程序员都能for(;;)while(true)或更快地识别while(1)


2
任何值得该死的程序员都应该能够立即识别出这三个。这三个都是很常见的,以至于花费超过5分钟阅读代码的每个人都多次看到它们。
cHao 2011年

1
研究表明,经验丰富的程序员可以for(;;)while(1):-) 理解14ms的速度更快
kevin cline
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.