«For (;;)» быстрее, чем «while (TRUE)»? Если нет, то почему люди используют это?

164
for (;;) {
    //Something to be done repeatedly
}

Я видел, как подобные вещи часто используются, но я думаю, что это довольно странно ... Разве не было бы намного яснее сказать while(true)или что-то в этом роде?

Я предполагаю, что (как причина, по которой многие программисты прибегают к загадочному коду), это крошечный запас быстрее?

Почему и стоит ли это того? Если так, то почему бы просто не определить это так:

#define while(true) for(;;)

Смотрите также: Что быстрее: while (1) или while (2)?

Крис Купер
источник
51
Что такое TRUE???
2010 г.,
20
@Steven Sudit: Что TRUEобщего с C? Стандартный макрос для истинного результата boolen в C99 по-прежнему true. Откуда TRUEвзялся?
AnT
31
Этот макрос не работает, #define EVER ;;хотя был использован в IOCCC, хотя .. :)
18
Разве это не макрос для #define while(TRUE)объявления макроса, который принимает один вызываемый аргумент, TRUEкоторый никогда не используется, поэтому превращает каждый цикл while в вашей программе в бесконечный цикл?
AshleysBrain
9
@ Steven Sudit: Нет. Там нет "стандартного макроса в VS 6.0". Макрос TRUEпроисходит из заголовочных файлов, связанных с Windows API. Это никак не связано с VS 6.0. И, как я уже говорил, это не имеет ничего общего ни с C, ни с C ++. В C ++ «истинный» литерал просто true(в VS 6.0 тоже), в C89 / 90 такого вообще нет, а в C99 это макрос true. Это относится ко всем компиляторам C / C ++.
2010 г.

Ответы:

262
  1. Это не быстрее.
  2. Если вам действительно важно, скомпилируйте с ассемблером выходные данные для вашей платформы и посмотрите.
  3. Это не важно Это никогда не имеет значения. Напишите свои бесконечные циклы, как вам нравится.
Бен Зотто
источник
227
Интуитивно понятно, что оптимизация бесконечного цикла дает возможность бесконечного ускорения. Хорошо, тогда мы не программируем на интуицию. :-)
Стивен Судит
5
Я полагаю, ты прав. Я думаю, что я был вовлечен в "религиозные" дебаты о мелочах. Спасибо, что расшатал мою совесть. : D
Крис Купер
6
@Steven LOL, это интересно, но затем учтите, что единственный сценарий, когда вы фактически достигли этого потенциала бесконечного ускорения, - это когда цикл никогда не прерывается и действительно работает бесконечно, что, скорее всего, является либо ошибкой, либо, если задумано, будет бесконечное ожидание, прежде чем оно достигнет этого потенциала.
AaronLS
7
@Крис. В программировании, как и в жизни, религиозные дебаты стоят только вашего времени на вещи, которые действительно имеют значение. Это просто не одна из тех вещей. Как видите, у каждого есть свой любимый способ написания бесконечного цикла. Выберите для себя то, что делает вас счастливее всего за мелочи, а затем запустите свой профилировщик для кода, который имеет значение. :)
Бен Зотто
3
Это имело значение, поскольку некоторые ранние компиляторы на некоторых платформах загружали константу и делали ее условный переход. Какие в те дни аппаратные средства имели значение.
peterchen
176

Я предпочитаю for(;;)по двум причинам.

Во-первых, некоторые компиляторы выдают предупреждения while(true) (что-то вроде «условие цикла является константой»). Избегать предупреждений всегда полезно.

Другое - это то, что я считаю for(;;)более понятным и выразительным. Я хочу бесконечный цикл. Это буквально имеет не состояние, это зависит ни от чего. Я просто хочу, чтобы это продолжалось вечно, пока я не сделаю что-то, чтобы вырваться из этого.

Тогда как с while(true) , ну, что правда, имеет отношение к чему-либо? Я не заинтересован в цикле, пока истина не станет ложной, что буквально говорит эта форма (цикл, пока истина истинна). Я просто хочу зациклить.

И нет, нет абсолютно никакой разницы в производительности.

jalf
источник
73
+1 за избежание предупреждений. Но что касается ясности, я нахожу пока более понятным, чем в этом контексте. Я думаю, что этот аспект сводится к личным предпочтениям.
Тим
14
Да, предпочтение и привычка. Если вы не привыкли видеть for(;;), это будет выглядеть странно. Но я бы рекомендовал пытаться привыкнуть к нему , потому что это общая идиома, и вы собираетесь снова запустить в него. ;)
jalf
7
Комментарий Джальфа о том, что он идиоматичен, действительно является ответом здесь. Это обычно используется для «бесконечного цикла» просто потому , что это обычно используется способ написания «зацикливание» в C. Там не должно быть хорошим поводом для идиомы - это просто самоукреплением конвенции.
кафе
7
@ Стив: Я не понимаю, почему я когда- либо использовал for(;condition;). Это то , что в то время как петля является для . Но, как я сказал, с бесконечным циклом я не хочу, чтобы компилятор сравнивал какие-либо условия. Наивно, с whileциклом, это должно было бы проверять trueкаждую итерацию (очевидно, даже самый тупой компилятор не сделал бы это, но это принцип, который беспокоит меня. Это поразило меня как чрезмерное уточнение вашего кода), в то время как с for(;;)буквально вы говорите «Нет условий для проверки. Просто цикл». Я нахожу это наиболее близким к вашему воображаемому эквивалентуloop {...}
jalf
32
Ваш компилятор отстой, если while(true)выдает предупреждение.
Альберт
56

Лично я использую, for (;;)потому что там нет никаких цифр, это просто ключевое слово. Я предпочитаю, чтобы while (true), while (1), while (42), и while (!0)т.д. и т.п.

ta.speot.is
источник
38
0, 1 и бесконечность - допустимые магические числа, расширяющие 0 и 1 до false, и true не является потерей. trueне более магическое число, чем forволшебное ключевое слово или for(;;)использует подразумеваемую магическую бесконечность. ( while (42)это действительно мерзость.)
38
Касательно: один из моих профессоров CS сказал: «В программировании есть только три числа: 0, 1 и n. Все остальное называется магическим числом».
Бен Зотто
21
Хотя (42) является самым крутым, не дает никакого другого результата относительно while (1) или while (true) или while (! 0) и имеет философское значение. Я полагаю, for(;;)в любом случае разбирается быстрее, чем другие
ShinTakezou
2
@ShinTakezou намного лучше #define LIFE 42 while (LIFE):)
mr5
1
ну while(true)тоже не содержит никакого числа. и для (;;) это не ключевое слово
RiaD
49

Из-за Денниса Ричи

  • Я начал использовать, for (;;)потому что именно так Деннис Ритчи делает это в K & R, и при изучении нового языка я всегда стараюсь подражать умным парням.

  • Это идиоматический C / C ++. Вероятно, в конечном итоге лучше привыкнуть к этому, если вы планируете многое делать в пространстве C / C ++.

  • Вы #defineне сработаете, так как вещь # define'd должна выглядеть как идентификатор C.

  • Все современные компиляторы генерируют одинаковый код для двух конструкций.

Марк Харрисон
источник
10
Да, это то, как вы узнаете, что кто-то узнал C из K & R, как это следует изучать. Всякий раз, когда я вижу while(TRUE), я подозреваю, что программист - новичок на C или изучил C из книги For Dummies.
Кристофер Джонсон
13
Я слышал, что эти новички тоже используют новый стиль определения функций .
Джастин
46

Это, конечно, не быстрее в любом нормальном компиляторе. Они оба будут скомпилированы в безусловные переходы. Версия for легче набрать (как сказал Нил) и будет понятна, если вы понимаете синтаксис цикла.

Если вам интересно, вот что дает мне gcc 4.4.1 для x86. Оба используют инструкцию JMP x86 .

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

компилируется в (частично):

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L2:
    movl    $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L5:
    movl    $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite
Мэтью Флэшен
источник
Я сомневаюсь, что это быстрее, даже в режиме отладки.
Стивен Судит
106
for_infiniteбыстрее; На 2 персонажа меньше puts.
Дейв Джарвис
43

Я предпочитаю, for (;;)потому что это наиболее последовательно в разных C-подобных языках.

В C ++ while (true)это хорошо, но в C вы зависите от определения заголовка true, но TRUEэто также часто используемый макрос. Если вы используете while (1)это правильно в C и C ++ и JavaScript, но не в Java или C #, которые требуют, чтобы условие цикла было логическим, например, while (true)или while (1 == 1). В PHP ключевые слова нечувствительны к регистру, но язык предпочитает использование заглавных буквTRUE .

Тем не менее, for (;;)всегда полностью правильно во всех этих языках.

Boann
источник
9
Спасибо за Ваш ответ! Я думаю, что это на самом деле первый ответ, который показывает объективный путь, который for (;;)лучше.
Крис Купер
8
Я не думаю, что мне когда-либо нужно было писать код, который был бы правильным на C, C ++, JavaScript, Java и C #. Это разные языки.
Кит Томпсон,
6
@KeithThompson это не о написании кода, который является правильным на многих языках; Я думаю, что это поможет избежать неправильной интерпретации между разработчиками с разным опытом.
Мауро Сампьетро
6
@sam: Оба while (1)и for (;;)являются общими идиомами для бесконечных циклов в C. Любой, кто читает программу на C, кто имеет проблемы с пониманием, вероятно, будет иметь проблемы с остальной частью кода. Не стоит писать код на C, который может быть легко прочитан кем-то, кто не знает C.
Кит Томпсон,
6
@KeithThompson Хотя компетентный читатель C обязательно должен быть знаком с обоими идиомами, это также может быть полезно, если автор является программистом полиглота. На моей последней работе я ежедневно работал над JS, ActionScript и PHP, и унификация способа написания кода (где это имеет смысл) может ускорить программирование и упростить обслуживание.
Ионокласт Бригам
21

Я лично предпочитаю for (;;)идиому (которая будет компилироваться в тот же код, что иwhile (TRUE) .

Использование while (TRUE)может быть более читабельным в некотором смысле, я решил использовать for (;;)идиому, потому что она выделяется .

Конструкция бесконечного цикла должна быть легко замечена или вызвана в коде, и я лично считаю, что for (;;)стиль делает это немного лучше, чем while (TRUE)илиwhile (1) .

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

Майкл Берр
источник
17

Я видел, что некоторые люди предпочитают это, потому что у них есть #define где-то вроде этого:

#define EVER ;;

Что позволяет им написать это:

for (EVER)
{
    /* blah */
}
rmeador
источник
24
Я тоже это видел; но это не веская причина для его предпочтения. Как сопровождающий, вам все равно придется проверять определение макроса, чтобы убедиться, что он выполнил то, что ожидал, тогда как исходный код был достаточно понятным. ОСРВ VxWorks не имеет макрос FOREVERопределен for(;;), но это не лучше. Макросы IMO не должны использоваться для «изобретения» нового языка.
Клиффорд,
8
На самом деле цель макросов в некоторых языках - придумать новый синтаксис. Но независимо от 'for (EVER)' в C / C ++ отвратительно.
Дэн Олсон
15
Некоторые люди делают забавные вещи, например, если им нравится Паскаль, они говорят #define BEGIN {и #define END }. Я даже видел, #define DONKEYS_FLY (0)чтобы они могли сказать if DONKEYS_FLY .... Кто сказал, что софт скучный?
Майк Данлавей
11
В Калифорнии, я полагаю, вы должны #define для (;;) LIKE_FOREVER
Мартин Беккет
1
Я не смог устоять: #define never while(0)и#define always
13
16

Как насчет (если ваш язык поддерживает это):

start:
/* BLAH */
goto start;
неумело
источник
... который должен генерировать идентичный вывод в руках любого разумного компилятора.
Бен Зотто
9
+1! Это не уменьшает gotoмногочисленные недостатки, но, если алгоритм, который вы пытаетесь реализовать, исходит из блок-схемы, это самый прямой перевод.
Эдмунд,
4
Я лично отношусь к утилитарному взгляду на goto. Здесь нет хищников. Хищники - люди. И именно люди начали использовать goto для написания кода для спагетти. Кроме того, собранный вывод для цикла выглядит примерно так же. Наборы команд для компьютеров не имеют понятия «для» или «пока», просто «прыгать».
josaphatv
никогда не используюgoto
Эдвард Карак
Самое приятное в том, что gotoвам не нужно беспокоиться о том, чтобы кто-то добавил, breakчтобы сделать ваш цикл менее бесконечным. (если вы уже внутри другогоwhile или в forцикле, конечно ...)
12

Там нет никакой разницы с точки зрения машинного кода, который генерируется.

Тем не менее, просто чтобы уловить тенденцию, я бы сказал, что форма while (TRUE) гораздо более читабельна и интуитивно понятна, чем для (;;), и что читаемость и ясность являются гораздо более важными причинами для руководящих принципов кодирования, чем какие-либо причины, по которым я ' Я слышал о подходе for (;;) (я предпочитаю основывать свои руководящие принципы кодирования на здравом рассуждении и / или доказательстве эффективности самостоятельно).

Джейсон Уильямс
источник
6
Это зависит от вашего языка. for(;;)это традиционный способ сделать это в C и C ++. while(true)кажется, соглашение в C # и Java и других языках. Ваш пробег может варьироваться.
Билли ОНил
9
Да, и кто-то, кто не очень знаком с C или C ++, может найти STRING_SCAN_FORMATTED более читабельным, чем sscanf, но вы не увидите, чтобы кто-то поместил #define STRING_SCAN_FORMATTED sscanf в начале своего кода.
ta.speot.is
4
Я бы сказал, что идиоматический способ сделать это должен быть наиболее читабельным для вашего разработчика. В противном случае вам действительно нужны лучшие разработчики.
2010 г.
5
@despart: Если кто-то недостаточно знаком с C ++, чтобы понять, что это за идиома, то ему нужно держаться подальше от моей кодовой базы.
Билли ОНил
4
Я согласен, что идиоматический способ должен быть наиболее читабельным. Вот почему идиоматические пути всегда должны быть оспорены и изменены по мере развития языков и практик. Потребовались годы, чтобы ужасный «идиоматический» стиль кодирования K & R был заменен современным, более читабельным стилем, но это все же произошло.
Джейсон Уильямс
11

Не просто известный шаблон, но стандартная идиома в C (и C ++)

Джеймс Маклеод
источник
3
Да, и я думаю, что некоторые компиляторы предупреждают по while (true)той же причине, что и они if (true).
Стивен Судит
11
while(true)

генерирует предупреждение с Visual Studio (условие является постоянным). В большинстве мест, где я работал, компилируются производственные сборки с предупреждениями об ошибках. Так

for(;;)

является предпочтительным.

Майкл
источник
7
какую версию visual studio вы используете? С 2008 года я не получаю это предупреждение, даже на уровне предупреждения 4.
Йорген Сигвардссон
11

Оба должны быть одинаковыми, если ваш код оптимизирован компилятором. Чтобы объяснить, что я имею в виду под оптимизацией, вот пример кода, написанного в MSVC 10:

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

Если вы строите его в режиме отладки ( без какой-либо оптимизации (/ Od) ), разборка показывает явную разницу. Есть дополнительные инструкции для trueусловия внутри while.

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)  

То, что вы будете использовать, не имеет значения для достойного компилятора с включенной оптимизацией скорости.

SylvanBlack
источник
На самом деле это очень хороший момент! Без оптимизации даже современные компиляторы будут отличаться несколькими инструкциями.
9

Это вопрос личных предпочтений, какой путь быстрее. Лично я сенсорный человек и никогда не смотрю на свою клавиатуру во время программирования - я могу коснуться всех 104 клавиш на моей клавиатуре.

Я найду, если быстрее набрать "while (TRUE)".

Я мысленно добавил некоторые измерения движения пальцев и суммировал их. «for (;;)» имеет около 12 значений ширины клавиш назад и четвертого (между клавишами «home» и клавишами, а также между клавишами «home» и клавишей SHIFT) «while (TRUE)» имеет около 14 значений ширины клавиш назад и четвёртый.

Тем не менее, я гораздо менее подвержен ошибкам при наборе последнего. Я мысленно думаю словами за один раз, поэтому я нахожу, что быстрее набирать такие слова, как «nIndex», чем аббревиатуры, такие как «nIdx», потому что я должен на самом деле мысленно произносить буквы, а не произносить их в уме, и пусть мои пальцы автоматически введите слово (например, езда на велосипеде)

(Мой тест TypingTest.com = 136 WPM)

Марк Рейхон
источник
3
Я считаю, что OP имел в виду скорость выполнения, а не скорость печати.
Я знаю. Просто пришлось покрыть эту базу тоже.
Марк Рейхон
7
s / личные предпочтения / индивидуальная привычка /
SamB
@SamB: Комментарий за голосование за s ///. xD И да, хотя я предположил, что это может быть связано со скоростью выполнения, я не знал фактического ответа. Если бы это было так, я был бы счастлив.
Крис Купер
Запустите time head -10 >/dev/null, введите каждые 10 раз и измерьте результаты. Бьюсь об заклад, вы будете быстрее, for(;;)если вы не обманываете. Я был примерно на 14%.
PSkocik
6

Все хорошие ответы - поведение должно быть точно таким же.

ОДНАКО - Просто предположим, что это имело значение. Предположим, что одна из них взяла еще 3 инструкции за итерацию.

Должны ли вы заботиться?

ТОЛЬКО если то, что вы делаете внутри цикла, почти ничего , а это почти никогда не так.

Я хочу сказать, что есть микрооптимизация и макрооптимизация. Микрооптимизация похожа на «стрижку, чтобы похудеть».

Майк Данлавей
источник
3
Как часто вы видите людей, которым говорят, что они предпочитают ++iбольше i++?
Деннис Зикефуз
7
@Dennis Zickefoose: Разница между ++iи i++может потенциально быть существенной, если iэто экземпляр класса, а не встроенный, и компилятор не применяет тривиальную оптимизацию. Совет состоит в том, чтобы приобрести привычку, чтобы она не застала вас врасплох.
Клиффорд
5
Суть в том, что ++iпротив « i++ничего» вам ничего не стоит делать «оптимизацию». Правда, в большинстве случаев это не имеет абсолютно никакого значения, но их одинаково легко набирать, так почему бы не предпочесть потенциально самый эффективный по умолчанию? И я предполагаю, что то же самое применимо и здесь. Если один был чуть-чуть быстрее другого, почему бы не пойти на более быстрый? Что бы мы потеряли, сделав это? Оба довольно легко читать и печатать.
2010 г. в полдень
2
@Dennis Zickefoose: Ты прав. Я вижу, что многое на SO, и комментарий Клиффорда прав. Кроме того, есть кое-что, чего я не вижу много в SO, и как это сделать макро-оптимизацию, например, 43-кратное ускорение: stackoverflow.com/questions/926266/… . Поэтому я задаюсь вопросом о наших приоритетах.
Майк Данлавей
2
@Mike: Да, но это сравнение яблок с апельсинами. Стрижка требует реального времени и, возможно, даже денег. Я согласен, что это такая микрооптимизация, что это не имеет значения. Но это также ничего не стоит нам. если я могу выбрать идти влево или вправо, расстояние одинаковое, местность одинаковая, все то же самое, за исключением того, что левый путь имеет незначительное микроскопическое преимущество, почему бы не пойти налево? Вы правы, это не впечатляющий аргумент. Но когда стоимость буквально равна нулю, я не вижу причин отдавать предпочтение менее оптимальному маршруту.
Джалф
5

Я не могу себе представить, что достойный компилятор будет генерировать любой другой код. Даже если бы это было так, не было бы способа определить без тестирования конкретного компилятора, который был бы более эффективным.

Однако я предлагаю вам предпочесть for(;;)по следующим причинам:

  • несколько компиляторов, которые я использовал, будут генерировать предупреждение о постоянном выражении для while (true) с соответствующими настройками уровня предупреждения.

  • в вашем примере макрос TRUE может быть определен не так, как вы ожидаете

  • Есть много возможных вариантов бесконечного цикла while, например while(1), while(true)и while(1==1)т.д .; поэтому for(;;), скорее всего, приведет к большей согласованности.

Клиффорд
источник
ИСТИНА не может быть #define ИСТИНА 1, но любая кодовая база, в которой while(TRUE)оценивается как, while(0)вряд ли выиграет for(;;).
Джастин
@Justin: я согласен, это было бы по-настоящему извращенно, и это не самый сильный из трех аргументов, но Бьярне Стоуструп использует аналогичный аргумент для избежания макроса NULL в C ++. while(true)должно быть предпочтительным в любом случае. В C ++ boolзарезервировано, а в C определено в C stdbool.h (что делает его менее безопасным в C). for(;;)удаляет все сомнения.
Клиффорд
5
for(;;Sleep(50))
{
    // Lots of code
}

Это яснее, чем:

while(true)
{
    // Lots of code
    Sleep(50);
}

Не то чтобы это применимо, если вы не используете Sleep().

Армада
источник
1
Это чертовски плохой код, вместо сна следует использовать таймер, так что это плохой пример
ST3
12
@ ST3 - Да, вы правы. Мой код ужасен. В следующий раз я должен стараться изо всех сил, чтобы сделать бесконечный цикл.
Армада
1
@Frammo - зависит от вашей ОС, но обычно что-то вродеtimerService.scheduleRepeating (50, [] () { /* lots of code */ });
Periata Breatta
2
Нет ничего чистого в вызове такой функции, как sleep внутри цикла for, подобного этому
Greg
1
OMG, timerService.scheduleRepeating (50, [] () {}) просто оооочень легче набрать и понять, чем sleep (50).
Cool Javelin
4

Цикл "навсегда" популярен во встроенных системах как фоновый цикл. Некоторые люди реализуют это как:

for (; ;)
{
 // Stuff done in background loop
}

И иногда это реализуется как:

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

И еще одна реализация:

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

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

Томас Мэтьюз
источник
8
Если компилятор генерирует другой код для них, пришло время отказаться от компилятора и получить его за последние два десятилетия.
GManNickG
5
«Время выполнения циклов не является большой проблемой, так как эти циклы продолжаются вечно» - это звучит так неправильно для меня ..
Блинди,
3
@Blindy - потому что это неправильно, то что беспокоит, так это доля времени, затраченного на обработку логики циклов, или количество циклов логики на единицу полезной работы, ни один из которых не поддерживается бесконечным циклом
Бен Фойгт,
3

Я предполагаю, что while (true) более читабельно, чем for (;;) - похоже, что программист пропускает что-то в цикле :)

Nik
источник
Я забочусь о скорости. Особенно, если есть оптимизация, которая будет влиять на мой код бесконечное количество раз.
Ковальски
2

Наиболее важной причиной использования «for (;;)» является боязнь использования «while (TRUE)» при выполнении исследовательского программирования. Проще контролировать количество повторений с помощью «for», а также легче преобразовать цикл «for» в бесконечный.

Например, если вы создаете рекурсивную функцию, вы можете ограничить количество вызовов этой функции перед преобразованием в бесконечный цикл.

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

Когда я уверен в своей функции, я преобразую ее в бесконечный цикл:

    for(;;) recursiveFunction(oneParam);
Игнасио Корторреал
источник
3
Первый цикл имеет синтаксическую ошибку (отсутствует точка с запятой).
Дженс
3
Ха! Тем самым демонстрируя обратную сторону для (;;);)
Эндрю