Java 中的奇怪 "for(;;)" 无限循环,这有什么用?
Strange "for(;;)" infinite loop in Java, how is this useful?
虽然我对Java有一些经验,但下面的代码对我来说有点奇怪:
public class ForLoopTest{
public static void main(String[] args){
<b>for(;;){}</b>
}
}
虽然初始化测试增量部分是空的,但这段代码编译得很好,不像通常的 for 循环:
for(int i=0; i<10; i++){}
由于代码编译良好,因此它是有效的语法。
这种没有初始化-测试-递增部分的for循环有实际用途吗?
相当于while(true) {}
.
没有真正的理由以这种方式使用或不使用 for 循环(而且您也不经常编写 while(true)
循环)。
卡亚曼是正确的。这种格式的循环需要在其中有一些退出条件,否则它无疑将是一个无限循环。大多数人在这种情况下使用 while(true) 因为它更容易理解。我有一个教授曾经告诉我 for(;;) {}
的唯一优点是它看起来比 while(true)
.
更令人印象深刻。
这是一个无限循环。你可以使用它的方式(不是无限循环)是这样的(你可能永远不会使用这种方式):
int i = 0;
for(;;) {
if(i == 10) {
break;
}
i++;
}
这是编写无限循环的一种方法。相当于:
while(true){ }
或者:
boolean loop = true;
while (loop) {
//do nothing
}
甚至:
int theAnswerToTheQuestionOfLifeTheUniverseAndEverything = 42;
while(theAnswerToTheQuestionOfLifeTheUniverseAndEverything == 42) {
//do nothing
}
你的循环 for(;;){}
相当于 while(true) {}
是的,这是一个无限循环。
如果你的问题是:有什么理由使用那个?
答案是也许是。
我举个例子:
如果你想做一个不时连续读取测量值的程序怎么办?
就像一个监视器,向您展示 dron 录音或类似的东西?
您可能需要这样的循环来刷新图像。
但是,是的,通常您不需要它。
正如 Kayaman 还提到的,它等同于 while(true) {}
。
我能想到的一个用例是——如果您需要在信号量文件到达目录后立即执行一些操作。您可以在无限循环中继续检查文件到达,一旦文件到达然后执行一些操作并打破循环
for(;;)
等价于 while(true)
。你在代码中更频繁地看到前者的原因是,它是 C
编程语言中编码无限循环的规范方式,Java 从那里借用了大量语法元素,这是背景很多 Java 开发人员。
使用 while(true)
可能看起来更直接,但是 C
编程语言一开始没有布尔类型,也没有 true
文字,所以等价物必须是 while(1)
那么,看起来并不比 for(;;)
好。它帮助后者成为一种常见模式,因为它被 K&R(参见 this answer)指定为永恒循环的成语。
好吧,改变编程语言并不一定意味着改变习惯,所以你在 Java 中看到 for(;;)
现在几乎和在 C 中一样频繁。
虽然我对Java有一些经验,但下面的代码对我来说有点奇怪:
public class ForLoopTest{
public static void main(String[] args){
<b>for(;;){}</b>
}
}
虽然初始化测试增量部分是空的,但这段代码编译得很好,不像通常的 for 循环:
for(int i=0; i<10; i++){}
由于代码编译良好,因此它是有效的语法。
这种没有初始化-测试-递增部分的for循环有实际用途吗?
相当于while(true) {}
.
没有真正的理由以这种方式使用或不使用 for 循环(而且您也不经常编写 while(true)
循环)。
卡亚曼是正确的。这种格式的循环需要在其中有一些退出条件,否则它无疑将是一个无限循环。大多数人在这种情况下使用 while(true) 因为它更容易理解。我有一个教授曾经告诉我 for(;;) {}
的唯一优点是它看起来比 while(true)
.
这是一个无限循环。你可以使用它的方式(不是无限循环)是这样的(你可能永远不会使用这种方式):
int i = 0;
for(;;) {
if(i == 10) {
break;
}
i++;
}
这是编写无限循环的一种方法。相当于:
while(true){ }
或者:
boolean loop = true;
while (loop) {
//do nothing
}
甚至:
int theAnswerToTheQuestionOfLifeTheUniverseAndEverything = 42;
while(theAnswerToTheQuestionOfLifeTheUniverseAndEverything == 42) {
//do nothing
}
你的循环 for(;;){}
相当于 while(true) {}
是的,这是一个无限循环。
如果你的问题是:有什么理由使用那个? 答案是也许是。
我举个例子:
如果你想做一个不时连续读取测量值的程序怎么办? 就像一个监视器,向您展示 dron 录音或类似的东西?
您可能需要这样的循环来刷新图像。
但是,是的,通常您不需要它。
正如 Kayaman 还提到的,它等同于 while(true) {}
。
我能想到的一个用例是——如果您需要在信号量文件到达目录后立即执行一些操作。您可以在无限循环中继续检查文件到达,一旦文件到达然后执行一些操作并打破循环
for(;;)
等价于 while(true)
。你在代码中更频繁地看到前者的原因是,它是 C
编程语言中编码无限循环的规范方式,Java 从那里借用了大量语法元素,这是背景很多 Java 开发人员。
使用 while(true)
可能看起来更直接,但是 C
编程语言一开始没有布尔类型,也没有 true
文字,所以等价物必须是 while(1)
那么,看起来并不比 for(;;)
好。它帮助后者成为一种常见模式,因为它被 K&R(参见 this answer)指定为永恒循环的成语。
好吧,改变编程语言并不一定意味着改变习惯,所以你在 Java 中看到 for(;;)
现在几乎和在 C 中一样频繁。