Ответ 1
Это эквивалентно while(true) {}
.
Нет никакой реальной причины использовать или не использовать цикл for таким образом (и не часто вы пишете цикл while(true)
).
Хотя у меня есть некоторый опыт работы на Java, следующий код выглядит немного странным для меня:
public class ForLoopTest{
public static void main(String[] args){
for(;;){}
}
}
Этот код компилируется отлично, хотя часть инициализации-test-increment пуста, в отличие от обычного цикла for:
for(int i=0; i<10; i++){}
Так как код компилируется отлично, это допустимый синтаксис.
Существует ли какое-либо практическое использование цикла этого типа для цикла, где нет части инициализации-теста-инкремента?
Это эквивалентно while(true) {}
.
Нет никакой реальной причины использовать или не использовать цикл for таким образом (и не часто вы пишете цикл while(true)
).
Это один из способов записи бесконечного цикла. Это эквивалентно:
while(true){ }
Или:
boolean loop = true;
while (loop) {
//do nothing
}
Или даже:
int theAnswerToTheQuestionOfLifeTheUniverseAndEverything = 42;
while(theAnswerToTheQuestionOfLifeTheUniverseAndEverything == 42) {
//do nothing
}
Это бесконечный цикл. То, как вы можете использовать его (без бесконечного цикла), будет таким (вы, вероятно, никогда не будете использовать этот путь):
int i = 0;
for(;;) {
if(i == 10) {
break;
}
i++;
}
Ваш цикл for(;;){}
эквивалентен while(true) {}
Да, это inifinite loop.
Если у вас есть вопрос: есть ли какие-либо причины использовать это? Ответ возможно, да.
Я приведу вам пример:
Что делать, если вы хотите делать программу, которая время от времени читает измерения? как монитор, показывающий вам, что делает запись дрона или что-то подобное?
Для обновления изображения вам может понадобиться такой цикл.
Но да, обычно вам это ничего не нужно.
Кайаман верен. Цикл в этом формате должен иметь какое-то условие выхода в нем, или он, несомненно, будет бесконечным циклом. Большинство людей используют в то время как (правда) в этом случае, так как это легче понять. У меня был профессор, когда-то сказал мне, что единственным преимуществом for(;;) {}
является то, что он выглядит более впечатляющим, чем while(true)
.
Как сказал Кайаман, он эквивалентен while(true) {}
.
Один случай использования, о котором я могу думать, - если вам нужно выполнить некоторую операцию, как только семафорный файл поступит в каталог. Вы можете продолжить проверку поступления файла в бесконечный цикл, как только файл поступит, выполните некоторую операцию и сломайте цикл
for(;;)
эквивалентен while(true)
. Причина, по которой вы чаще всего видите код в коде, заключается в том, что это канонический способ кодирования бесконечного цикла на языке программирования C
, из которого Java заимствовал множество синтаксических элементов и который является фоном многих разработчиков Java.
Использование while(true)
может выглядеть более прямолинейно, но язык программирования C
не имел логических типов и true
литерала в начале, поэтому эквивалент должен был быть while(1)
, тогда, который не выглядит лучше, чем for(;;)
. Это помогло последнему стать общей моделью, так как она была указана K & R (см. этот ответ) как идиома для вечного цикла.
Ну и изменение языка программирования не обязательно подразумевает изменение привычек, поэтому вы видите for(;;)
в Java сейчас почти так же часто, как в C.