Простой цикл do while с использованием while(true);

Много раз в примерах программ на C я встречал подобные циклы. Что на самом деле делают такие циклы?

do {

    while (...) // Check some condition if it is true.
    { 
        calculation 1
    }

    // Some new condition is checked.

} while(true);

Зачем нужен while(true); Используется ли он для бесконечного цикла? Может кто-нибудь объяснить, что на самом деле делает приведенный выше цикл. Я новичок в программировании на C


person Dev    schedule 18.02.2013    source источник
comment
Я никогда не видел do while(true). Это бесконечный цикл, но идиоматический (и понятный) способ написать его, если for (;;).   -  person Fred Foo    schedule 18.02.2013


Ответы (8)


Эти циклы используются, когда кто-то хочет зацикливаться вечно, а условие выхода из цикла неизвестно. Определенные условия задаются внутри цикла вместе с операторами break или return для выхода из цикла. Например:

while(true){
    //run this code
    if(condition satisfies)
        break;    //return;
}

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

person Sargam Modak    schedule 25.05.2015

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

do {

    while () //check some condition if it is true
     { 
     calculation 1
    }

    //some  new condition is checked,if condition met then break out of loop


    } while(true);
person Cris    schedule 18.02.2013

В C все циклы зацикливаются, пока условие истинно. Таким образом, явное true в условии действительно означает «зацикливание, пока true истинно», и поэтому зацикливается навсегда.

person Some programmer dude    schedule 18.02.2013
comment
В for(;;) где или какое условие? :-) - person Jens; 18.02.2013
comment
@Jens У меня есть доступ только к спецификации C++11, но в ней говорится, что цикл for эквивалентен циклу while, а в §2 раздела 6.5.3 говорится, что отсутствующее условие делает подразумеваемый пункт while эквивалентным while(true) - person Some programmer dude; 18.02.2013
comment
@Jens В 6.8.5.3 (2): пропущенное выражение-2 заменяется ненулевой константой, где выражение-2 — это условие цикла. Таким образом, условие вставляется неявно, если вы его не записываете (но, конечно, согласно правилу «как если бы» вы часто будете получать безусловный переход). - person Daniel Fischer; 18.02.2013

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

person Ivaylo Strandjev    schedule 18.02.2013

Бесконечный цикл полезен, если проверка условия остановки не может быть выполнена ни впереди (как с for и while), ни сзади (как с do{}while). Вместо этого вы просто зацикливаетесь, а в середине кода можете проверить условие и сломать: if(something) break;.

person Bernd Elkemann    schedule 18.02.2013

иногда мы используем его, например:

do
     recv(s , &buf, len, flags);
while(true)

пример из winsock windows api, таким образом вы можете слушать из порта.

person La VloZ    schedule 18.02.2013

do {
  // code here
} while(true);

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

Подобно этому

if(condition)
   break;

Если ваша программа достигла некоторого момента, когда условие истинно, она автоматически завершит цикл do-while и после этого перейдет к коду.

person krato    schedule 06.09.2013

Общий отличительный фактор между следующими петлями:

while (condition) {action}
do {action} while (condition)

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

Другими словами, условие для while проверяется в начале цикла, а для do while — в конце.

Часто вы будете видеть код, в котором разработчики, кажется, не знают о do-while, поскольку они пишут:

result = doSomething();
while (result == NOT_FINISHED) {
    result = doSomething();
}

что может быть лучше записано как:

do {
    result = doSomething();
} while (result == NOT_FINISHED);

Однако в вашем конкретном случае, когда условие всегда true, это не имеет большого значения. Следующие циклы в основном эквивалентны (используя 1 для истинного случая):

for (;;) { doSomething(); }
for (;;doSomething());

while (1) { doSomething(); }
do { doSomething(); } while (1);

while (doSomething(),1);

BADPAX: doSomething(); goto BADPAX;

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

Второй цикл for просто перемещает тело цикла в итерационную часть оператора for.

Первый while также иногда встречается в дикой природе, а do-while, вероятно, реже. Единственное различие здесь заключается в том, что первые циклы всегда проверяют в верхней части цикла, а вторые циклы всегда проверяют в нижней части цикла.

Последний цикл while использует оператор запятой C так, как вы, вероятно, никогда не должны :-)

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

person paxdiablo    schedule 22.01.2015