Зачем использовать бесконечные петли?

Другой плакат спросил о предпочтительном синтаксисе для бесконечных циклов.

Следующий вопрос: Почему вы используете бесконечные циклы в своем коде? Обычно я вижу такую ​​конструкцию:

for (;;) {
  int scoped_variable = getSomeValue();
  if (scoped_variable == some_value) {
    break;
  }
}

Это позволяет вам не видеть значение scoped_variable в предложении for или while. Каковы некоторые другие применения для "бесконечных" циклов?

Ответ 1

Петля вроде:

while (true)
{
    // do something
    if (something else) break;
    // do more
}

позволяет вам вырваться из цикла в середине, а не в начале (while/for) или end (do-while).

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

Ответ 2

Я использую бесконечный цикл для тела моего встроенного управляющего кода, поскольку он предназначен для запуска навсегда после его запуска.

Ответ 3

Конечные машины. Они не должны заканчиваться, пока вы не достигнете конечного состояния, после чего вы сломаете или вернетесь.

Ответ 4

while( 1 )
{
    game->update();
    game->render();
}

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

Ответ 5

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

int scoped_variable;
do {
    scoped_variable = getSomeValue();
} while (scoped_variable != some_value);

Бесконечные циклы чаще всего используются, когда экземпляр цикла не имеет теста завершения в верхней или нижней части, в простейшем случае. Это имеет тенденцию происходить, когда в цикле есть две части: код, который должен выполняться каждый раз, и код, который должен выполняться только между каждой итерацией. Это, как правило, происходит на таких языках, как C, когда вы делаете такие вещи, как чтение из файла или обработка набора результатов базы данных, где многое должно быть сделано явно. Большинство языков с новыми парадигмами могут структурировать такой код на самом деле в тесте.

Ответ 6

Почти все приложения используют бесконечный Основной цикл.;)

Ответ 7

Я хотел бы использовать бесконечный цикл для программирования системы наведения ракеты.

while ( true ) { go2Target ( ) ; }

С точки зрения компьютера управления ракетами цикл, который был запущен, повторяется до конца времени.

Возможно, пуристы предпочли бы

while ( ! blown2Bits ( ) ) { go2Target ( ) ; }

но тогда как вы реализуете метод blow2Bits? что бы это означало, если blow2Bits вернулись?

Ответ 8

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

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

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

Ответ 9

Есть другие вопросы, связанные с if/when ok, чтобы использовать break в цикле. Предположим, что мы согласны с тем, что иногда это нормально. В таких обстоятельствах (надеюсь, редко) я бы использовал бесконечный цикл, если существует ряд условий завершения и не существует идентифицируемого "первичного" условия завершения.

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

В конечном счете это вопрос вкуса.

Ответ 10

Я использую их для написания демонов/сервисов Linux, которые зацикливаются до тех пор, пока не будут получены сигналы о прекращении/другие терминалы.

Ответ 11

Бесконечные циклы полезны главным образом в процессах daemon/service или основной петле в игре. Вы даже можете получить с ними милый, например:

const bool heatDeathOfTheUniverse = false;
do 
{
     // stuff
} while(!heatDeathOfTheUniverse);

Они должны не использоваться для "ожидания" для таких вещей, как потоки, как было предложено Fry. Вы можете использовать метод Join объекта потока для этого.

Однако, если вы находитесь в ситуации, когда ваш технический руководитель говорит: "бесконечные циклы verboten, а также несколько методов/функций возвращаются и ломаются", вы также можете делать такие вещи:

bool done = false;
while(!done) 
{
    if(done = AreWeDone()) continue; // continue jumps back to start of the loop   
} 

Конечно, если ваш технический лидер заставляет вас делать такие вещи, вы должны начать искать новую работу.

Подробнее о ключевом слове continue см. в этой статье MSDN.

Ответ 12

Webservers используют бесконечный цикл while:

while(true)
{
    //Do something like respond to requests
}

Они не должны заканчиваться, если вы не закрываете приложение веб-сервера.

Ответ 13

Я использовал их при ожидании завершения нескольких потоков в С#, но теперь я использую класс ThreadPool.

Ответ 14

В отличие от ситуаций с встроенными системами бесконечные циклы всегда:

Repeat
   Something
Until Exit_Condition;

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

Бывают моменты, когда ясность торговли скоростью имеет смысл, но что-то, что не дает ни ясности, ни скорости просто быть технически корректным? Похоже на плохую идею для меня. Любой компетентный программист знает, что while (true) означает, что условие завершения находится где-то внутри цикла.