Чи "for (;;)" швидше, ніж "while (ІСТИНА)"? Якщо ні, то чому люди його використовують?


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

Я бачив, як подібні речі багато використовували, але я вважаю, що це досить дивно ... Чи не було б набагато зрозуміліше сказати while(true), чи щось у цьому напрямку?

Я здогадуюсь, що (як це причина багатьох програмістів, що вдаються до криптовалютного коду), це швидкий запас швидкості?

Чому, і чи дійсно це варте? Якщо так, то чому б просто не визначити це так:

#define while(true) for(;;)

Дивіться також: Що швидше: поки (1) або поки (2)?


51
Що таке TRUE???
ANT

20
@Steven Sudit: Що стосується TRUEC? Стандартний макрос для справжнього булевого результату в C99 все ще є true. Звідки TRUEвзявся?
ANT

31
Цей макрос не працює, #define EVER ;;хоча він використовувався в IOCCC, але .. :)

18
Хіба це не макрос для #define while(TRUE)оголошення макросу, який приймає один аргумент, який називається, TRUEякий ніколи не використовується, тому перетворюючи кожен цикл у вашій програмі на нескінченний цикл?
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 ++.
ANT

Відповіді:


262
  1. Це не швидше.
  2. Якщо вам справді все одно, компілюйте з асемблером вихід для своєї платформи і подивіться, щоб побачити.
  3. Це не має значення. Це ніколи не має значення. Пишіть свої нескінченні петлі, як тільки вам подобається.

227
Інтуїтивно зрозуміло, що оптимізація нескінченного циклу пропонує потенціал для нескінченного прискорення. Добре, що тоді ми не програмуємо на інтуїцію. :-)
Стівен Судіт

5
Я гадаю, ти маєш рацію. Я думаю, що я потрапив у "релігійні" дебати про дрібниці. Дякую за те, що потряс мою совість. : D
Кріс Купер

6
@Steven LOL, що цікаво, але тоді врахуйте, що єдиний сценарій, коли ви насправді досягли цього потенціалу нескінченного прискорення, це коли цикл ніколи не ламається і справді працює нескінченно, що, швидше за все, або помилка, або за призначенням, буде нескінченне очікування, перш ніж воно досягне цього потенціалу.
AaronLS

7
@Chris. У програмуванні, як у житті, релігійні дебати варті вашого часу лише на речі, які дійсно мають значення. Це просто не одна з таких речей. Як бачите, у кожного є домашній спосіб написання нескінченного циклу. Виберіть для себе те, що робить вас найщасливішими для дрібниць, а потім запустіть свого профайлера за важливим кодом. :)
Ben Zotto

3
Це мало значення, оскільки деякі ранні компілятори на деяких платформах завантажували константу і зробили її умовний стрибок. Що в ті дні апаратне забезпечення, мало значення.
peterchen

176

Я віддаю перевагу for(;;)з двох причин.

Одне полягає в тому, що деякі компілятори виробляють попередження while(true)(щось на кшталт "умова циклу є постійною"). Уникати попереджень - це завжди добре.

Інше - я вважаю, що for(;;)це ясніше і чіткіше. Я хочу нескінченну петлю. Він буквально не має умови, це нічого не залежить. Я просто хочу, щоб це тривало вічно, доки я не зроблю щось, щоб вирватися з нього.

Тоді як while(true), ну, що справжнього стосується будь-чого? Мені не цікаво циклічно, поки істина не стане хибною, про що говорить ця форма буквально (цикл, коли правда - правда). Я просто хочу петлю.

І ні, різниці в продуктивності абсолютно немає.


73
+1 для уникнення попереджень. Але що стосується ясності, то я вважаю, що ясніше, ніж у цьому контексті. Я думаю, що цей аспект просто зводиться до особистих переваг.
Тім

14
Так, перевагу і звичку. Якщо ви не звикли бачити for(;;), це, очевидно, буде виглядати дивно. Але я б рекомендував спробувати звикнути до нього, тому що це загальна ідіома, і ви збираєтеся знову зіткнутися з цим. ;)
jalf

7
коментар jalf про те, що він є ідіоматичним, справді є відповіддю. Зазвичай він використовується для "нескінченного циклу" просто тому, що це звичайний спосіб написання "нескінченного циклу" в C. Не має бути вагомих причин для ідіоми - це лише умовляння, що посилюється.
caf

7
@Steve: Я не бачу, чому б я коли-небудь користувався for(;condition;). Це те , що в той час як петля є для . Але, як я вже сказав, з нескінченним циклом, я не дуже хочу, щоб компілятор порівнював будь-які умови. Наївно, з whileциклом, доведеться перевіряти trueкожну ітерацію (очевидно, це не зробив би навіть найсміливіший компілятор, але це мене турбує принцип. Це вражає мене, як переоцінка вашого коду), тоді як for(;;)ви з ним буквально говорите "немає умови для тестування. Просто цикл". Я вважаю це найближчим еквівалентом вашому уявномуloop {...}
jalf

32
Ваш компілятор смокче, якщо while(true)подає попередження.
Альберт

56

Особисто я використовую, for (;;)оскільки в ньому немає жодної кількості, це просто ключове слово. Я вважаю за краще, щоб while (true), while (1), while (42), і while (!0)т.д. і т.п.


38
0, 1 і нескінченність є прийнятними магічними числами, поширюючи 0 і 1 на хибні і істинні, не є втратою. trueце не більше магічне число, ніж forмагічне ключове слово, яке for(;;)використовує магічну нескінченність. ( while (42)це справді гидота.)

38
Дотична: один з моїх професорів CS сказав: "У програмуванні є лише три числа: 0, 1 і п. Все інше називається магічним числом".
Ben Zotto

21
тоді як (42) найкрутіший, він не дає різного результату щодо (1) або поки (істинного) або поки (! 0), і має філософський зміст. Я припускаю for(;;), що в будь-якому разі розбирається швидше, ніж інші
ShinTakezou

2
@ShinTakezou набагато краще #define LIFE 42 while (LIFE):)
mr5

1
також while(true)не містить жодної кількості. і for (;;) - не ключове слово
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 ++ while (true)це нормально, але в С ви залежаєте від визначення заголовка true, але TRUEмакрос теж часто використовується. Якщо ви використовуєте while (1)це правильно в C і C ++ та JavaScript, але не Java або C #, для яких потрібна умова циклу бути булевим, наприклад, while (true)або while (1 == 1). У PHP ключові слова не залежать від регістру, але мова віддає перевагу великій літери TRUE.

Однак, for (;;)завжди цілком коректно в усіх цих мовах.


9
Дякую за вашу відповідь! Я думаю, що це насправді перша відповідь, яка показує об’єктивний спосіб, який for (;;)кращий.
Кріс Купер

8
Я не думаю, що мені ніколи не потрібно писати правильний код на C, C ++, JavaScript, Java та C #. Вони різні мови.
Кіт Томпсон

6
@KeithThompson мова не в тому, щоб написати код, який є правильним для багатьох мов; Я думаю, що мова йде про те, щоб уникнути неправильного трактування між розробниками з різним походженням.
Mauro Sampietro

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).

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


17

Я бачив, як деякі люди віддають перевагу тому, що вони мають десь десь такий:

#define EVER ;;

Що дозволяє їм написати це:

for (EVER)
{
    /* blah */
}

24
Я теж це бачив; але це не є вагомою причиною віддавати перевагу цьому. Як обслуговуючий персонал, вам все одно доведеться перевірити визначення макросу, щоб бути впевненим, що він робив те, що ви очікували, тоді як початковий код був досить зрозумілим. RTOS VxWorks має FOREVERвизначений макрос for(;;), але це не краще. Макроси ІМО не повинні використовуватися для "винайдення" нової мови.
Кліффорд

8
Насправді мета макросів у деяких мовах - придумати новий синтаксис. Але незалежно від "для (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
alfC

16

А як щодо (якщо ваша мова це підтримує):

start:
/* BLAH */
goto start;

... який повинен генерувати однаковий вихід у руках будь-якого розумного компілятора.
Бен Зотто

9
+1! Це не усуває gotoчисленні недоліки, але, якщо алгоритм, який ви намагаєтеся реалізувати, походить з блок-схеми, це найбільш прямий переклад.
Едмунд

4
Я особисто переймаюсь утилітарною думкою про гото. Немає грабіжників. Грабіжники - це люди. І саме люди почали використовувати гото для виготовлення коду спагетті. Крім того, зібраний вихід для циклу виглядає приблизно так само. Набори інструкцій для комп’ютерів не мають понять "для" або "поки", просто "стрибок".
josaphatv

ніколи ніколи не використовуюgoto
Едвард Карак

Дійсно приємна річ у gotoтому, що вам не потрібно турбуватися про те, що хтось додає, breakщоб зробити вашу петлю менш нескінченною. (якщо ви вже не знаходитесь в іншому whileчи forциклі, звичайно, ...)

12

Немає різниці в генеруванні машинного коду.

Однак, лише щоб погіршити тенденцію, я заперечую, що форма "TRUE" набагато легше читається та інтуїтивно зрозуміла, ніж для (;;), і що читабельність та чіткість є набагато важливішими причинами кодування керівних принципів, ніж будь-які причини " я чув про підхід for (;;) (я вважаю за краще, щоб мої вказівки щодо кодування ґрунтувалися на ґрунтовних міркуваннях та / або доказі ефективності).


6
Це залежить від вашої мови. for(;;)це традиційний спосіб зробити це на C і C ++. while(true)схоже, це умова на C # та Java та інших мовах. Ваш пробіг може відрізнятися.
Біллі ONeal

9
Так, і хтось, хто не дуже добре знайомий з C або C ++, може виявити STRING_SCAN_FORMATTED читабельнішим, ніж sscanf, але ви не бачите, щоб хтось ставив #define STRING_SCAN_FORMATTED sscanf у верхній частині коду.
ta.speot.is

4
Я б сказав, що ідіоматичний спосіб зробити це краще, щоб він був найбільш читабельним для вашого розробника. Інакше вам справді потрібні кращі розробники.
jalf

5
@despart: Якщо хтось недостатньо знайомий з C ++, щоб визнати цю ідіому такою, якою вона є, то їм потрібно триматися, не до кінця, від моєї бази даних.
Біллі ONeal

4
Я погоджуюсь, що ідіоматичний спосіб повинен бути найбільш читабельним. Ось чому ідіоматичні способи завжди потрібно кидати виклик і змінювати в міру розвитку мов і практик. Минули роки, щоб жахливий "ідіоматичний" стиль кодування замінився сучасним, читабельнішим стилем, але все-таки це сталося.
Джейсон Вільямс


11
while(true)

генерує попередження за допомогою Visual Studio (стан постійний). Більшість місць, де я працював, складають виробництво, будуючи з попередженнями як помилками. Так

for(;;)

є кращим.


7
яку версію візуальної студії ви використовуєте? З 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)  

Однак якщо ви будуєте свій код у режимі випуску (за замовчуванням Maximize Speed ​​(/ 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)  

Що б ви не використовували, значення для гідного компілятора з оптимізацією швидкості не має значення.


Це насправді дуже вдалий момент! Без оптимізації навіть сучасні компілятори будуть відрізнятися кількома інструкціями.

9

Це питання особистої переваги, який шлях швидший. Особисто я є доносником і ніколи не дивлюся на свою клавіатуру під час програмування - я можу зазначити сенсорний тип усіх 104 клавіш на клавіатурі.

Я знаходжу, якщо швидше набрати "while (TRUE)".

Я подумки додав кілька вимірювань руху пальців і підсумував їх. "for (;;)" має приблизно 12 ширин рухів назад і четвертого (між домашніми клавішами та клавішами, і між домашніми клавішами та клавішею SHIFT) "у той час, як (TRUE)" має приблизно 14 ширини рухів назад і четвертий.

Однак я набагато менше схильний до помилок під час введення останнього. Я подумки думаю словами за один раз, тому мені здається, що швидше набирати такі речі, як "nIndex", ніж абревіатури типу "nIdx", тому що я маю насправді подумки прописати буквене позначення, а не промовляти це всередині своєї думки та пускати пальці в авто -введіть слово (як їзда на велосипеді)

(Мій показник TypingTest.com = 136 WPM)


3
Я вважаю, що ОП мав на увазі швидкість виконання, а не набирав швидкість.

Я знаю. Просто потрібно було покрити і цю базу.
Марк Реджон

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++тим, що це не коштує вам нічого, щоб зробити "оптимізацію". Щоправда, у більшості випадків це абсолютно не має різниці, але їх однаково легко набрати, так чому б не віддати перевагу потенційно найбільш ефективним за замовчуванням? І я вважаю, що це стосується і тут. Якщо один був крихітним трохи швидшим за інший, то чому б не піти на швидший? Що б ми втратили, зробивши це? Обидва досить легко читати та набирати текст.
jalf

2
@Dennis Zickefoose: Ти маєш рацію. Я бачу, що багато про SO, і коментар Кліффорда є правильним. Крім того, є що - то я НЕ бачу багато на SO, і це, як зробити макро-оптимізації, на кшталт 43X: прискорення stackoverflow.com/questions/926266 / ... . Тож мені цікаво про наші пріоритети.
Майк Данлаве

2
@Mike: Так, але це порівняння яблук з апельсинами. Стрижка вимагає фактичного часу і, можливо, навіть грошей. Я згоден, це така мікрооптимізація, що насправді це не має значення. Але це також нам нічого не коштує . якщо я можу вибрати ліворуч або праворуч, і відстань однакова, місцевість однакова, все те саме, за винятком того, що лівий шлях має певну граничну мікроскопічну користь, чому б не піти ліворуч? Ви маєте рацію, це не вражаючий аргумент. Але коли вартість буквально дорівнює нулю, я не бачу причин віддавати перевагу менш оптимальному маршруту.
джельф

5

Я не можу уявити, що гідний компілятор генерував би інший код. Навіть якби це було, не було б можливості визначитись без тестування конкретного компілятора, який був би більш ефективним.

Однак я пропоную віддати перевагу for(;;)з наступних причин:

  • кілька використовуваних мною компіляторів генеруватимуть попередження про постійне вираження на час (правда) з відповідними налаштуваннями рівня попередження.

  • у вашому прикладі макро TRUE може бути визначено не так, як ви очікували

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


TRUE може не бути #define TRUE 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
Існує нічого чисто про виклик функції , як сон всередині для циклу , як цей
Greg

1
OMG, timerService.scheduleRepeating (50, [] () {}) просто так набагато простіше набрати та зрозуміти, як заснути (50).
Прохолодний Джавелін

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

Я припускаю, що (true) читабельніше, ніж для (;;) - схожий на те, що програміст щось пропускає для циклу :)


Я дбаю про швидкість. Особливо, якщо є оптимізація, яка вплине на мій код нескінченно.
Ковальські

2

Найважливішою причиною використання "для (;;)" є страх використовувати "while (TRUE)", коли ви робите дослідницьке програмування. Простіше контролювати кількість повторень за допомогою "за", а також, простіше перетворити цикл "для" в нескінченний.

Наприклад, якщо ви будуєте рекурсивну функцію, ви можете обмежити кількість викликів до функції перед перетворенням у нескінченний цикл.

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

Коли я впевнений у своїй функції, тоді я перетворюю її у нескінченний цикл:

    for(;;) recursiveFunction(oneParam);

3
Перший цикл має синтаксичну помилку (відсутня крапка з комою).
Єнс

3
Га! Тим самим демонструючи зворотний бік for (;;);)
Андрій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.