Эквивалент использования цикла for вместо цикла do-while

Мне было интересно, вместо использования цикла do-while, что эквивалентно циклу for или любой другой комбинации циклов в c?


person deathshot    schedule 22.12.2013    source источник
comment
Что вы думаете? Основная проблема с do-while (по сравнению с прямым while) заключается в том, что цикл всегда повторяется хотя бы один раз.   -  person Hot Licks    schedule 23.12.2013


Ответы (3)


Любой цикл может быть создан из комбинации бесконечного цикла «навсегда» и условного оператора break.

Например, для преобразования

do {
    <action>
} while (<condition>);

для цикла for вы можете сделать это:

for (;;) {
    <action>
    if (!<condition>) break;
}

Вы можете использовать тот же трюк, чтобы преобразовать цикл do/while в цикл while, например:

while (true) {
    <action>
    if (!<condition>) break;
}

Более того, цикл вообще не нужен: любое из вышеперечисленных можно смоделировать с меткой вверху и goto внизу; это распространенный способ выполнения циклов в языках ассемблера. Единственная причина, по которой три циклические конструкции были введены в язык, заключалась в том, чтобы сделать язык более выразительным: цикл do/while намного лучше реализует идею автора, чем любая из показанных выше альтернатив.

person Sergey Kalinichenko    schedule 22.12.2013
comment
Итак, if (!‹условие›) ломается; будет таким же, как часть сделать? - person deathshot; 23.12.2013
comment
@deathshot Да, условие прерывания - это условие продолжения с отрицанием. - person Sergey Kalinichenko; 23.12.2013

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

do {
    A;
} while (B)

становится

int flag=1;
while (flag || B) {
    flag=0;
    A;
}

но на самом деле это не альтернатива, это просто скрывает ваше первоначальное намерение.

person Guntram Blohm    schedule 22.12.2013

Следующие три цикла эквивалентны:

#define FALSE (0)
#define TRUE  (!(FALSE))

do
{
    status = getStatus();
}
while(status == TRUE);

status = TRUE;
while(status == TRUE)
{
    status = getStatus();
}

for(status = TRUE; status == TRUE; status = getStatus())
{
}
person Fiddling Bits    schedule 23.12.2013
comment
@OliCharlesworth Спасибо. - person Fiddling Bits; 23.12.2013
comment
О, я действительно намекал, что идиоматически это будет писаться как status, а не status == true. - person Oliver Charlesworth; 23.12.2013
comment
Просто пытаюсь быть явным ради новых программистов. Определенно лучше использовать while(status). - person Fiddling Bits; 23.12.2013
comment
И разве это не должно быть также status = TRUE; (а не true) для назначения перед тем как? - person Rich; 07.05.2015
comment
@Rich Исправлено. Спасибо. - person Fiddling Bits; 13.05.2015