2013-12-22 3 views
7

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

+0

Что вы думаете? Основная проблема с do-while (vs straight 'while') заключается в том, что цикл всегда выполняет итерацию хотя бы один раз. –

ответ

8

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

Например, чтобы преобразовать

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

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

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

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

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

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

+0

Итак, if (! ) break; будет такой же, как и часть? – deathshot

+0

@deathshot Да, условие «нарушения» является отрицательным условием «продолжения». – dasblinkenlight

2

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

do { 
    A; 
} while (B) 

становится

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

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

3

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

#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()) 
{ 
} 
+0

'status == true'? –

+0

@OliCharlesworth Спасибо. –

+0

О, я действительно намекнул, что это будет идиоматично записываться как «статус», а не «status == true». –

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