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 中一样频繁。