Оба должны быть одинаковыми, если ваш код оптимизирован компилятором. Чтобы объяснить, что я имею в виду под оптимизацией, вот пример кода, написанного на MSVC 10:
int x = 0;
while(true) // for(;;)
{
x +=1;
printf("%d", x);
}
Если вы собираете его в режиме отладки (без какой-либо оптимизации (/ Od)), разборка показывает явную разницу. Внутри while
есть дополнительные инструкции для условия true
.
while(true)
00D313A5 mov eax,1 //extra
00D313AA test eax,eax //extra
00D313AC je main+39h (0D313B9h) //extra
{
x +=1;
00D313AE mov eax,dword ptr [x]
00D313B1 add eax,1
00D313B4 mov dword ptr [x],eax
printf("%d", x);
...
}
00D313B7 jmp main+25h (0D313A5h)
for(;;)
{
x +=1;
00D213A5 mov eax,dword ptr [x]
00D213A8 add eax,1
00D213AB mov dword ptr [x],eax
printf("%d", x);
...
}
00D213AE jmp main+25h (0D213A5h)
Однако, если вы создаете свой код в режиме Release (со значением по умолчанию Максимальная скорость (/ O2)), вы получите одинаковый результат для обоих. Оба цикла сводятся к одной инструкции перехода.
for(;;)
{
x +=1;
01291010 inc esi
printf("%d", x);
...
}
0129101C jmp main+10h (1291010h)
while(true)
{
x +=1;
00311010 inc esi
printf("%d", x);
...
}
0031101C jmp main+10h (311010h)
Что бы вы ни использовали, не имеет значения для приличного компилятора с включенной оптимизацией скорости.
person
SylvanBlack
schedule
02.10.2013
true
. Для C используйтеTRUE
. Это все. - person Steven Sudit   schedule 10.04.2010TRUE
с C? Стандартный макрос для истинного логического результата в C99 по-прежнемуtrue
. Откуда взялсяTRUE
? - person AnT   schedule 10.04.2010for(;;)
является более ясной конструкцией.while (true)
означает, что вы проверяетеtrue
каждый цикл; очевидно, я знаю, что это оптимизировано, но это ненужный код. - person meagar   schedule 10.04.2010#define EVER ;;
использовался в IOCCC .. :) - person   schedule 10.04.2010#define while(TRUE)
объявления макроса, который принимает один аргумент с именемTRUE
, который никогда не используется, поэтому превращает каждый цикл while в вашей программе в бесконечный цикл? - person AshleysBrain   schedule 10.04.2010TRUE
. - person Steven Sudit   schedule 11.04.2010TRUE
поступает из файлов заголовков, связанных с Windows API. Это никак не связано с VS 6.0. И, как я уже сказал, это не имеет ничего общего ни с C, ни с C ++. В C ++ истинный литерал - это простоtrue
(также в VS 6.0), в C89 / 90 такого нет вообще, а в C99 это макросtrue
. Это относится ко всем компиляторам C / C ++. - person AnT   schedule 11.04.2010TRUE
#define. Этот #define присутствует в C Windows SDK в течение некоторого времени, до добавленияtrue
к языку, поэтому я назвал его C ++, а не C. Теперь, когда я объяснил себя, я действительно не заинтересован в придирках после этого момента. - person Steven Sudit   schedule 12.04.2010while(1)
, хотя я уверен, что вы не были родился орлом. - person Mateen Ulhaq   schedule 20.11.2011for (;;)
быстрее (???), чемwhile (1)
. Вера в сообщество программистов снова потеряна. - person   schedule 01.07.2013for(;;)
всего 7 символов, гдеwhile(true)
равно 11, дажеwhile(1)
равно 8. Так что с точки зрения Бешеной разработки приложений мы все должны четко использоватьfor
. Особенно, когда;;
использует ценную домашнюю недвижимость, обычно разбазариваемую QWERTY. - person   schedule 31.03.2014#define EVER ;;
никогда не использовался в IOCCC, по крайней мере, в выигрышной записи. Когда я впервые изучал C, я действительно использовал#define EVER ;;
или, возможно,#define EVER (;;)
. В то время я подумал, что это очень умно. Я все еще думаю, что это очень умно; Я просто больше не считаю, что это хорошо. - person Keith Thompson   schedule 24.07.2014