Чому я бачу так багато конструкцій (;;)? [зачинено]


14

На мій погляд, цикл for for використовується для перегляду відомого або визначеного діапазону.

String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }

що еквівалентно (розміщення i вбік):

String[] names = //something;
int i = 0;
while (i < names.length )
{
   // do stuff
   i++;
}

Іншими словами, forпетля - це просто (дуже корисний) синтаксичний цукор для загальновживаної whileконструкції.

Однак я бачу в Інтернеті багато for(;;)конструкцій, які функціонально еквівалентніwhile(true)

Які міркування для цього? Чому б нескінченний цикл віддав перевагу над нескінченним циклом, а цикл?

// Я навіть бачив підручник java, який взагалі не використовував циклів! Ведучий до таких жахливих конструкцій, як:

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}

Основна причина - перевага. Читання повинно брати участь у виборі, однак YMMV.
Аарон Маківер

Чому хтось віддасть перевагу незручній конструкції?
Кріс Кадмор

10
Ви можете поміняти місцями, whileі forтут питання не зміниться. while(true)і for(;;)означають те саме. Ви, очевидно, маєте сильні переваги while, інші ж можуть мати однаково сильні переваги for. Неможливо сказати, що одне правильніше, ніж інше.
Калеб

3
@chris, я взагалі не вважаю for(;;)заплутаним. Це стандартна ідіома С, яку ви задокументуєте в розділі 3.5 K&R (2e). Я розумію, що вам це не подобається; ви повинні розуміти, що інші, очевидно, віддають перевагу (інакше ви цього ніколи не бачили) Він може бути більш-менш прийнятним для інших мов, ніж C; ви позначили цю мову-агностик, що лише зменшує можливість остаточної відповіді. Знову я проголосував за закриття, оскільки Q не конструктивний; якби мене образили, я б позначив це як образливий, замість або як додаток до закриття. Це все.
Калеб

1
Особисто я думаю, що є реальна можливість мати ще один синтаксис, призначений повністю для нескінченних циклів: щось на зразокwheeeeeeee { ... }
11:40

Відповіді:


33

Це затримка від старих практик програмування на PDP-11 (так, я сказав, старі ). Він використовувався для збереження єдиної інструкції, яка була корисною для того, щоб петлі працювали швидше.

Для отримання додаткової інформації див. Наступне: http://www.flounder.com/exceptions.htm


3
Саме це я і шукав. Існує реальна, законна причина, але вона вже не діє.
Кріс Кадмор

1
@chris Nnnope, сучасні компілятори іноді будуть скаржитися на використання константи в умовах циклу. Це не суто захоплення.
Ізката

Є більше, ніж це. Я пам'ятаю, як писати C на початку 1990-х на системах Unix, і тоді (правда) {} це не було варіантом. Не було стандартного булевого типу, але декілька unix-систем визначили свою власну у файлах заголовків C. З пам'яті щонайменше один постачальник Unix визначив TRUE як нуль, нібито, щоб допомогти обробляти функцію повертається, оскільки умовою було повернути нуль на успіх, а позитивні цифри - невдачі. Це означало, що поки (TRUE) {} не було портативним.
Майкл Шоу

1
Я зараз не можу його знайти, але можу покластись, що кілька років тому Денніс Річі написав пост на Usenet, в якому заявив, що це просто неправильно, і він / вони використовують for(;;)синтаксис як (на їхню думку) більш пряме твердження намір, щоб не було визначено критеріїв для виходу з циклу.
Джеррі Труну

@Ptolemy: Ну ви, звичайно, могли написати while(1) { }.
Ред С.

10

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


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

5

Це звичка, здобута в програмуванні на С, де немає булевого типу. Хоча (1) потенційно є еквівалентом, але For (;;) часто використовується, як це відображається в K&R, якщо я правильно пам'ятаю. Я підозрюю, що там десь була і апаратна причина.


4
... підозрюю , що була апаратна причина ...
Аарон МакІвер

2
Як згадував Едвард Робертсон, причина полягає в тому, що компілятор C на PDP-11 не усвідомлював, що істина в "while (true)" була постійною часом компіляції і додала б додаткову інструкцію (порівняння) при створенні збірки. Через обмежені ресурси, доступні в PDP-11, програмісти використовували цикл for, щоб оптимізувати одну додаткову інструкцію з програми.
Jetti

3

бо (;;) можна читати як "назавжди", що деякі вважають більш природним, ніж "поки правдивим".


Незважаючи на те, що це не первісна причина, це вторинна причина, чому вподобання затрималося довго після того, як початкова причина застаріла. Дуже важко викласти будь-які докази на підтвердження цього, однак, крім того, щоб просити досвідчених програмістів.
DarenW

-2

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


2
Будь-який програміст, котрий вартий чорт, повинен мати можливість розпізнати всіх трьох миттєво. Усі три є досить поширеними, що кожен, хто витратив більше 5 хвилин на читання коду, побачив кожного з них купу разів.
cHao

1
Дослідження показали, що досвідчені програмісти можуть зрозуміти 14 for(;;)мс швидше, ніж while(1):-)
kevin cline
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.