Какой смысл использовать "while (true) {...}"? - PullRequest
1 голос
/ 16 октября 2010

Почему некоторые люди используют блоки while(true){} в своем коде? Как это работает?

Ответы [ 7 ]

8 голосов
/ 16 октября 2010

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

Когда он пуст, он служит для остановки программы на неопределенный срок *;в противном случае обычно в цикле есть условие, которое, если оно истинно, прерывает цикл:

while (true)
{
    // ...

    if (stopLoop)
        break;

    // ...
}

Это часто чище, чем вспомогательный флаг:

bool run = true;
while (run)
{
    // ...

    if (stopLoop)
    {
        run = false;
        continue; // jump to top
    }

    // ...
}

Также обратите внимание, что некоторые порекомендуют for (;;) вместо этого по разным причинам.(А именно, это может избавить от предупреждения, похожего на «условное выражение всегда истинно».)

* В большинстве языков.

5 голосов
/ 16 октября 2010

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

// Always tests all conditions in loop header:
while( (condition1 && condition2) || condition3 || conditionN_etc ) {

    // logic...

    if (notable_condition)
        continue;  // skip remainder, go direct to evaluation portion of loop

    // more logic
    // maybe more notable conditions use keyword: continue
}

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

// Always tests all conditions in body of loop logic: 
while(true) {

    //logic...

    if (!condition1 || !condition2)
        break;  // Break out for good. 

    // more logic...

    if (!condition3)
        break;

     // even more logic ...
}

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

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

Также не забывайте о do.. while.Окончательное решение может использовать эту версию конструкции while, чтобы изменить условную логику по своему вкусу.

do {
    //logic with possible conditional tests and break or continue 
} while (true); /* or many conditional tests */

В заключение, просто приятно иметь опции как программист.Так что не забудьте поблагодарить авторов вашего компилятора.

4 голосов
/ 16 октября 2010

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

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

Распространенный сценарий, где это используется, в играх; Вы хотите продолжать обрабатывать действие и рендерить кадры, пока игра не выйдет.

3 голосов
/ 16 октября 2010

Когда Эдсгер В. Дейкстра был молод, это было эквивалентно:

         Do loop initialization
 label a:
         Do some code
         If (Loop is stoppable and End condition is met) goto label b
                     /* nowadays replaced by some kind of break() */
         Do some more code, probably incrementing counters
         go to label a
 label b:
         Be happy and continue

После того, как Дейкстра решил стать антиготоистом и убедил орды программистов сделать это, на землю пришла религиозная вера и достоверность кода стала очевидной.

Итак,

 Do loop initialization
 While (true){
    some code
    If (Loop is stoppable and End condition is met) break();
    Do some more code, probably incrementing counters
 }
 Be happy and continue

Заменил мерзость.

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

 Nest[f[.],x, forever[May God help you break]]   

Итак, loop рекурсия стала действительно неудержимой или, по крайней мере, недемонстративно остановленной.

2 голосов
/ 16 октября 2010

while (условие) {выполнить функцию} когда условие истинно .. оно выполнит функцию.

так пока (правда) условие всегда верно он продолжит цикл.

кодирование никогда не будет продолжено.

1 голос
/ 16 октября 2010

Реальная точка для while (true) {..} заключается в том, что семантика условий выхода не имеет сильного единственного предпочтения, так что это хороший способ сказать читателю, что «ну, на самом деле существуют условия A, B C .., но вычисления условий слишком длинные, поэтому они были помещены во внутренние блоки независимо в порядке ожидаемой вероятности появления ".

1 голос
/ 16 октября 2010

Это цикл, который выполняется вечно, если только внутри тела нет оператора break.

...