Общий отличительный фактор между следующими петлями:
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
do while(true)
. Это бесконечный цикл, но идиоматический (и понятный) способ написать его, еслиfor (;;)
. - person Fred Foo   schedule 18.02.2013