В чем разница между бесконечными циклами while и for? - PullRequest
6 голосов
/ 21 августа 2010

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

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

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

Ответы [ 6 ]

7 голосов
/ 21 августа 2010

Они семантически эквивалентны.(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; } нет.

2 голосов
/ 21 августа 2010

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

   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**
} 
1 голос
/ 19 августа 2014

Разницы нет.

Но

while () foo ();

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

для (;; Foo ();)

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

1 голос
/ 21 августа 2010

Разницы нет.

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

См. Также: Is "for (;;) "быстрее чем" пока (ИСТИНА) "?Если нет, то почему люди используют его?

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

0 голосов
/ 26 сентября 2015

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

0 голосов
/ 21 августа 2010

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

...