Вопрос: Strange "for (;;)" бесконечный цикл в Java, как это полезно? [Дубликат]


На этот вопрос уже есть ответ:

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

public class ForLoopTest{
    public static void main(String[] args){
        для(;;){} 
    } 
}

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

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

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

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


10


источник


Ответы:


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

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


12



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

while(true){ }


Или:

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

Или даже:

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


8



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

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

6



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

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

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

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

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

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


4



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


2



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

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

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


2



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

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


2