2010-08-21 3 views
5

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

while() 
    foo(); 
for(;;) 
    foo(); 

Но на самом деле, в чем разница, я должен знать? какая из них лучше?

ответ

7

Они семантически эквивалентны. (x;y;z) { foo; } эквивалентен x; while (y) { foo; z; }. Они не совсем эквивалентны в других версиях стандарта, в примере for (int x = 0; y; z), область x является блоком for и выходит за рамки после окончания цикла, тогда как с int x; while (y) x он все еще находится в области действия после окончания цикла.

Другое отличие состоит в том, что for интерпретирует отсутствующий y как ИСТИНА, тогда как while должен быть снабжен выражением. for (;;) { foo; } - хорошо, но while() { foo; } - нет.

+1

FYI, вопрос задает вопрос о бесконечных циклах, а не о семантике for vs в целом. –

+3

Если вы хотите обойти локализацию выражения 'x', вы можете сказать' for (x; y; z) {foo; } 'эквивалентно' {x; while (y) {foo; г; }} '. –

+0

Что касается семантики, стандарт языка C для for-loops позволяет построить цикл for, который идентичен циклу while. Это, однако, противоречит более глубокому смысловому пониманию цикла for, который неизменно содержит вариант цикла (который часто определяется как тождественно положительный для удобства). Для согласованной семантики должно выполняться четкое разделение между циклами, где счетчик итераций известен до выполнения цикла (for-loops), и циклы, где счетчик итераций неизвестен до выполнения (while-loops). – Schedler

0

Первый не компилируется. Вам нужно как минимум: while(true). Они семантически эквивалентны. Это вопрос стиля/личного выбора.

1

Нет никакой разницы.

За исключением цикла while, вы должны установить там какое-то истинное состояние, например. while(1).

Смотрите также: Is "for(;;)" faster than "while (TRUE)"? If not, why do people use it?

Кроме того, «лучше» один может быть один, который не является бесконечным. :)

+1

Хорошая находка с другим вопросом , – Nullw0rm

2

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

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

while(1) 
004113DE mov   eax,1      **// This is the difference** 
004113E3 test  eax,eax      **// This is the difference** 
004113E5 je   main+2Eh (4113EEh) 
     f(); 
004113E7 call  f (4110DCh) 
004113EC jmp   main+1Eh (4113DEh)   **// This is the difference** 
    for(;;) 
     f(); 
004113EE call  f (4110DCh) 
004113F3 jmp   main+2Eh (4113EEh)   **// This is the difference** 
} 
+2

Эта разница определенно не существует при включенной оптимизации. –

+0

Разница заключается только в том, что по умолчанию режим отладки отключен. Первые три строки фактически проверяют, является ли '1! = 0', то есть если условие истинно. – casablanca

+0

И разница в 'jmp' - это просто немного другое смещение. –

1

Нет никакой разницы.

Но

в то время как() Foo();

не то же самое, что

для (;; Foo();)

Помните! Если вы нарушаете while перед оператором foo(), foo() не выполняется, но если вы нарушаете for, foo() выполняет ...

0

они оба одинаковы .. современные компиляторы излучают идентичные код для обоих .. интересно (исторически?) the for (;;) был более популярен .. программисты pascal делали #define (;;) когда-либо и использовали навсегда {// код}

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