Как работает цикл for, особенно для (;;)? - PullRequest
61 голосов
/ 16 августа 2011

Просматривая старый код компании, я наткнулся на цикл for, который выглядит следующим образом:

for (;;) {
    //Some stuff
}

Я попробовал Google, но не смог найти ответы. Я заснул в классе программирования или это необычный цикл?

Ответы [ 6 ]

86 голосов
/ 16 августа 2011

A for цикл в Java имеет следующую структуру -

for (initialization statement; condition check; update)
    loop body;

Как видите, здесь четыре утверждения -

  1. Оператор инициализации: этот оператор выполняется только один раз, когда цикл вводится впервые. Это необязательное утверждение, означающее, что вы можете оставить это поле пустым. Обычно используется для некоторой цели инициализации.
  2. Условная проверка: это утверждение, пожалуй, самое важное. Он проверяет, является ли определенное выражение истинным. Если это так, то выполнение цикла продолжается. Вы можете оставить это поле пустым, что будет оценено как true.
  3. Обновление: этот список операторов выполняется слева направо, обычно используется для увеличения / уменьшения некоторой переменной.
  4. тело цикла: тело цикла, которое будет выполняться снова и снова на основе значения истинности условной проверки.

По сути, так следует выполнение: сначала, когда цикл вводится впервые, оператор инициализации выполняется один раз. Затем выполняется условная проверка, чтобы увидеть, оценивается ли она как true. Если это так, то выполняется тело цикла, в противном случае выполнение цикла заканчивается. После этого выполняется оператор (ы) Update. Затем условная проверка выполняется снова, и если она оценивается как истина, то снова выполняется тело цикла, затем выполняется оператор обновления, затем снова условная проверка .... Вы получаете изображение.

Теперь о вашем for( ; ; ) синтаксисе. У него нет оператора инициализации, поэтому ничего не будет выполнено. Его оператор условной проверки также пуст, что означает, что после этого выполняется тело цикла. Далее, поскольку оператор обновления пуст, ничего не выполняется. Затем снова выполняется условная проверка, которая снова оценивается как истина, и затем весь этот процесс снова повторяется.

Итак, вы видите, что это в основном бесконечный цикл, у которого нет оператора инициализации, чья условная проверка всегда будет иметь значение true, а у которого нет оператора обновления. Это эквивалентно -

while(true)
{
    .....
}

- еще одна популярная конструкция цикла в Java.

Когда вы используете такой бесконечный цикл, важно обращать внимание на условие прерывания, поскольку в большинстве случаев вы не можете позволить циклу работать бесконечно. Чтобы вырваться из таких циклов, вы можете использовать оператор break. Структура выглядит следующим образом -

if(some_condition_is_true)
    break;        // This will cause execution to break out of its nearest loop

или

if(some_condition_is_false)
    break;
38 голосов
/ 16 августа 2011

Это так же, как:

while(true) {
  //Some Stuff
}

По сути, альтернативный синтаксис для бесконечного цикла.

9 голосов
/ 16 августа 2011

Это все бесконечные циклы

for(;;) {
   // endlessly
}

while(true) {
   // endlessly
}

do {
   // endlessly
} while(true);
6 голосов
/ 16 августа 2011

Этот цикл не имеет защиты и действует как цикл while (true).Он будет бесконечно зацикливаться до перерыва.

3 голосов
/ 16 августа 2011

Это бесконечный цикл. Не совсем хорошее кодирование, потому что оно не интуитивно понятно, то есть фактически скомпилирует или не выдаст ошибку времени выполнения. Перезапись как while(true) { /* code */ } была бы намного более удобочитаемой, чтобы указать бесконечный цикл.

2 голосов
/ 16 августа 2011

Это бесконечный цикл.Все операторы инициализации, условия и приращения являются необязательными, поэтому без какого-либо из них это всегда будет повторяться снова (если не будет достигнут разрыв или какая-либо другая конструкция с ним не взаимодействует).

Хотя я не уверен в этомJava, этот вопрос объясняет, как в .Net ваши пустые for и while (true) будут скомпилированы точно так же.Я не удивлюсь, если Java сделает то же самое.

...