Strange "for (;;)" бесконечный цикл в Java, как это полезно?

Хотя у меня есть некоторый опыт работы на Java, следующий код выглядит немного странным для меня:

public class ForLoopTest{
    public static void main(String[] args){
        for(;;){}
    } 
}

Этот код компилируется отлично, хотя часть инициализации-test-increment пуста, в отличие от обычного цикла for:

for(int i=0; i<10; i++){}

Так как код компилируется отлично, это допустимый синтаксис.

Существует ли какое-либо практическое использование цикла этого типа для цикла, где нет части инициализации-теста-инкремента?

Ответ 1

Это эквивалентно while(true) {}.

Нет никакой реальной причины использовать или не использовать цикл for таким образом (и не часто вы пишете цикл while(true)).

Ответ 2

Это один из способов записи бесконечного цикла. Это эквивалентно:

while(true){ }


Или:

boolean loop = true;
while (loop) {
    //do nothing
}

Или даже:

int theAnswerToTheQuestionOfLifeTheUniverseAndEverything = 42;
while(theAnswerToTheQuestionOfLifeTheUniverseAndEverything == 42) { 
    //do nothing
} 

Ответ 3

Это бесконечный цикл. То, как вы можете использовать его (без бесконечного цикла), будет таким (вы, вероятно, никогда не будете использовать этот путь):

int i = 0;
for(;;) {
  if(i == 10) { 
      break;
  }
  i++;
}

Ответ 4

Ваш цикл for(;;){} эквивалентен while(true) {} Да, это inifinite loop.

Если у вас есть вопрос: есть ли какие-либо причины использовать это? Ответ возможно, да.

Я приведу вам пример:

Что делать, если вы хотите делать программу, которая время от времени читает измерения? как монитор, показывающий вам, что делает запись дрона или что-то подобное?

Для обновления изображения вам может понадобиться такой цикл.

Но да, обычно вам это ничего не нужно.

Ответ 5

Кайаман верен. Цикл в этом формате должен иметь какое-то условие выхода в нем, или он, несомненно, будет бесконечным циклом. Большинство людей используют в то время как (правда) в этом случае, так как это легче понять. У меня был профессор, когда-то сказал мне, что единственным преимуществом for(;;) {} является то, что он выглядит более впечатляющим, чем while(true).

Ответ 6

Как сказал Кайаман, он эквивалентен while(true) {}.

Один случай использования, о котором я могу думать, - если вам нужно выполнить некоторую операцию, как только семафорный файл поступит в каталог. Вы можете продолжить проверку поступления файла в бесконечный цикл, как только файл поступит, выполните некоторую операцию и сломайте цикл

Ответ 7

for(;;) эквивалентен while(true). Причина, по которой вы чаще всего видите код в коде, заключается в том, что это канонический способ кодирования бесконечного цикла на языке программирования C, из которого Java заимствовал множество синтаксических элементов и который является фоном многих разработчиков Java.

Использование while(true) может выглядеть более прямолинейно, но язык программирования C не имел логических типов и true литерала в начале, поэтому эквивалент должен был быть while(1), тогда, который не выглядит лучше, чем for(;;). Это помогло последнему стать общей моделью, так как она была указана K & R (см. этот ответ) как идиома для вечного цикла.

Ну и изменение языка программирования не обязательно подразумевает изменение привычек, поэтому вы видите for(;;) в Java сейчас почти так же часто, как в C.