Я смог вытащить, удалив файл, который вызывал проблему, но на самом деле это не лучшее решение.
Цикл как:
while (true)
{
// do something
if (something else) break;
// do more
}
позволяет Вам убежать из цикла в середине, а не в запуске (в то время как/для) или конец (делают - в то время как).
Если у Вас есть сложное условие, Вы могли бы также хотеть использовать этот стиль для создания кода более четким.
Я использую бесконечный цикл для тела моего встроенного кода управления, так как это разработано для выполнения навсегда, после того как это запускается.
while( 1 )
{
game->update();
game->render();
}
Править: Таким образом, мое приложение существенно базируется вокруг бесконечного цикла, и я не могу быть побеспокоен для рефакторинга всего только, чтобы иметь эстетическую чистоту всегда завершения путем уменьшения с конца основных ().
Конечные автоматы. Они, как предполагается, не заканчиваются, пока Вы не достигаете конечного состояния, в которой точке Вы повреждаетесь или возвращаетесь.
Это - неполный пример, потому что он может быть пересмотрен, чтобы быть испытательным шлейфом конца без потери ясности, функции или производительности.
int scoped_variable;
do {
scoped_variable = getSomeValue();
} while (scoped_variable != some_value);
Бесконечные циклы чаще всего используются, когда экземпляр цикла не имеет теста завершения наверху или нижней части в самом простом случае. Это имеет тенденцию происходить, когда существует две части к циклу: код, который должен выполниться каждый раз и код, который должен только выполниться между каждым повторением. Это имеет тенденцию происходить на языках как C при выполнении вещей как чтение из файла или обработка набора результатов базы данных, где много должно быть сделано явно. Большинство языков с более новыми парадигмами может структурировать такой код на самом деле в тест.
Почти все приложения используют бесконечный Основной цикл.;)
Один пример находится в сценарии типа насоса сообщения, где Вы хотите циклично выполнить навсегда обработку любых сообщений, которые входят, пока не сказали для остановки. Другой - то, если Вы хотите принять периодические меры затем, Вы могли бы записать бесконечный цикл со сном в них (хотя может быть лучше использовать некоторую форму таймера для этого).
Могут быть некоторые другие места, где цикл должен выполнить определенное количество работы, чтобы определить, должно ли это выйти, и это может быть более чисто только для использования break
когда это условие верно, а не установило некоторый внешний флаг, чтобы указать, что цикл должен выйти.
Обычно, хотя я думаю, что это - лучшая практика, чтобы поместить Ваше условие выхода в инструкцию циклов, если это возможно, вместо того, чтобы сделать это бесконечным и выйти из цикла с помощью a break
оператор, потому что условие выхода цикла более очевидно.
Я использую их, чтобы записать демонам Linux / сервисы, которые цикл до уничтожает / другие сигналы завершения получены.
Существуют другие вопросы, касающиеся, если/когда нормально использовать break
в цикле. Давайте предположим, что мы соглашаемся, что это иногда в порядке. При тех обстоятельствах (надо надеяться, редкий) я использовал бы бесконечный цикл, если существует много завершающихся условий и никакое идентифицируемое "основное" условие завершения.
Это избегает длинного ряда разъединений (or's) и также привлекает внимание читателя к тому, что там может (почти наверняка быть) быть перерывами в цикле.
В конечном счете это - вопрос вкуса.
Кроме бесконечных циклов ситуаций со встроенными системами всегда действительно:
Repeat
Something
Until Exit_Condition;
Но иногда Exit_Condition не что-то, что может на самом деле быть оценено в конце цикла. Вы могли всегда устанавливать флаг, использовать тот флаг, чтобы пропустить остальную часть цикла и затем протестировать его в конце, но это означает тестирование его по крайней мере дважды (код немного медленнее), и лично я нахожу это менее ясным.
Существуют времена, когда торговая ясность для скорости имеет смысл, но что-то, что не дает ни ясности, ни скорости только, чтобы быть технически корректным? Походит на плохую идею мне. Любой компетентный программист знает, что, в то время как (верный) означает, условие завершения где-нибудь в цикле.
Я раньше использовал их при ожидании нескольких потоков для завершения в c#, но теперь я использую класс ThreadPool.
Бесконечные циклы полезны главным образом в процессах демона/сервиса или основном цикле в игре. Можно даже стать милыми с ними, например:
const bool heatDeathOfTheUniverse = false;
do
{
// stuff
} while(!heatDeathOfTheUniverse);
Они не должны использоваться для "ожидания" вещей как потоки, как был предложен Жарким. Можно использовать метод Соединения объекта потока для этого.
Однако, если Вы находитесь в ситуации, где Ваш технический вывод говорит, "бесконечные циклы являются verboten и так являются несколькими возвратами метода/функции и повреждениями", можно также сделать материал как это:
bool done = false;
while(!done)
{
if(done = AreWeDone()) continue; // continue jumps back to start of the loop
}
Конечно, если Вы, технический вывод вынуждает Вас сделать такие вещи, необходимо начать искать новое задание.
Для получения дополнительной информации на продолжать ключевом слове см. эту статью MSDN.
Веб-серверы используют бесконечный цикл while:
while(true)
{
//Do something like respond to requests
}
Они не должны заканчиваться, если вы не закроете приложение веб-сервера.
Я бы подумал об использовании бесконечного цикла для программирования системы наведения ракеты.
while ( true ) { go2Target ( ) ; }
С точки зрения компьютера наведения ракеты, однажды начатый цикл повторяется до конца времени.
Возможно, пуристы предпочли бы
while ( ! blown2Bits ( ) ) { go2Target ( ) ; }
, но как тогда реализовать метод blow2Bits? что бы это значило, если бы blow2Bits вернул истину?