2008-10-22 6 views
8

Другой плакат спросил около preferred syntax for infinite loops.Зачем использовать бесконечные петли?

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

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

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

+0

Связанный вопрос: http://stackoverflow.com/questions/224138/infinite-loops-top-or-bottom – CesarB 2008-10-22 02:07:42

ответ

27

петля как:

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

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

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

+2

FWIW, я также предпочитаю «while (true)» или «while» (1) «to» for (;;) ». Легче читать, IMO. – 2008-10-22 02:04:05

+0

Отличный пример конструкции, которая в противном случае требуется дублирование: A, while (что-то еще) {B; A;} – 2008-10-22 02:18:04

11

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

8

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

+0

Я не понимаю этого. Почему бы просто не написать что-то вроде «while (! Machine.state == finished) {machine.nextState();} – 2008-10-22 02:39:01

+2

Это не обязательно было бы так ясно, особенно если вы хотите проверить переменную` machine.state` на конкретная точка в цикле – 2008-10-22 04:18:53

0

Раньше я использовал их, когда ожидал, что несколько потоков будут выполнены в C#, но теперь я использую класс ThreadPool.

2

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

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

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

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

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

4

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

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

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

0

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

Repeat 
    Something 
Until Exit_Condition; 

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

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

1

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

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

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

1

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

1

Бесконечные циклы полезны главным образом в процессах 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 
} 

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

Для получения дополнительной информации о ключе ключевого слова см. this MSDN статья.

3

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

1

WebServers использовать бесконечное во время цикла:

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

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

3

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

while (true) { go2Target () ; } 

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

Возможно, пуристы будут благоприятствовать

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

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

Смежные вопросы