Зачем использовать бесконечные циклы? - PullRequest
8 голосов
/ 22 октября 2008

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

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

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

Что позволяет обойтись без возможности увидеть значение scoped_variable в предложении for или while. Какие еще варианты используются для «бесконечных» циклов?

Ответы [ 14 ]

27 голосов
/ 22 октября 2008

Петля вроде:

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

позволяет выходить из цикла в середине, а не в начале (пока / для) или в конце (пока).

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

11 голосов
/ 22 октября 2008

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

8 голосов
/ 22 октября 2008
while( 1 )
{
    game->update();
    game->render();
}

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

8 голосов
/ 22 октября 2008

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

4 голосов
/ 22 октября 2008

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

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

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

3 голосов
/ 27 мая 2010

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

while ( true ) { go2Target ( ) ; }

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

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

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

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

3 голосов
/ 22 октября 2008

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

2 голосов
/ 22 октября 2008

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

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

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

1 голос
/ 26 июля 2009

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

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

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

1 голос
/ 22 октября 2008

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...