Има ли разлика между използването за (;;) и докато (1)?


Отговор 1:

По отношение на генерирания код, всеки съвременен компилатор на C трябва да ви даде същите резултати.

Автори, професор и други, които казват, че за (;;) генерират повече режийни разходи или (a) не знаят за какво говорят, или (b) работят с древни или счупени съставители. за (;;) не генерира допълнително режийни разходи, тъй като няма условие и няма стъпване на циклична променлива. Ако не друго, докато (1) в древен неоптимизиращ компилатор всъщност може да доведе до повече режийни разходи, тъй като той ясно проверява дали 1 не е нула в горната част на всяка итерация. Съвременните съставители няма да направят това.

В някои реализации на компилатора, ако сте завишили нивата на предупреждение достатъчно високо или използвате полезна подобна програма, може да получите предупреждение за време (1) или негов еквивалент, което казва, че нещо като условен израз е постоянно. за (;;) не генерира такова предупреждение, защото изобщо няма условен израз. Работил съм по проекти, в които искахме да компилираме с нулеви предупреждения и затова избрах да използваме за (;;), вместо за еквивалент известно време (1). Също така, за (;;) може да се търси по-лесно от вариантите while.

Между другото, ако ще използвате докато, ще се счита за по-четено да кажете:

докато (вярно)

отколкото да казвам:

докато (1)

въпреки че първата изисква повече пишене.

В съвременния C (т.е. от C99 през 1999 г.) не бива да създавате своя собствена версия на TRUE. Вместо това включете заглавния файл stdbool.h и ще имате достъп до дефинирания тип данни на bool (вместо да се налага да използвате ключовата дума _Bool) и символите true и false. Прехвърлянето на вашите собствени истински / фалшиви стойности е толкова ...

... 1998 година.


Отговор 2:

Стандартът: Стандарт C ++

6.5.3 The for statement1 Операторът for (for-init-statement conditionopt; expressionopt) израза е еквивалентен на [code] {for-init-statement while (условие) {израз израз; }} [/ code], с изключение на това, че имената, декларирани в for-init-оператора, са в същия декларативен регион като тези, декларирани в условието, и с изключение на това, че продължението в оператора (не е затворено в друг оператор за повторение) ще изпълни израз преди повторно -оценяващо състояние. [Забележка: По този начин първото изречение определя инициализацията за цикъла; условието (6.4) определя тест, направен преди всяка итерация, така че цикълът да излезе, когато състоянието стане невярно; изразът често указва нарастване, което се прави след всяко повторение. Липсващото условие прави подразбиращата се клауза еквивалентна на while (true).

Може би


Отговор 3:

Всеки компилатор, струващ неговата сол, би генерирал идентичен код и в двата случая.

Едно от възможните предпочитания за опцията за (;;) е, че някои (много?) Хора смятат, че това е "лош стил", за да използват цифрови константи в кода. Тоест, не пишете

х + = 10;

но пишете

статичен const int my_constant_value = 10;

(...)

x + = my_constant_value;

Причината е, че наличието на всички цифрови константи, декларирани изрично (и за предпочитане в началото на изходния файл, а не разпространение в целия файл), води до по-поддържан код.

Очевидно няма никаква разлика по отношение на (;;) vs while (1), но виждането на '1' в код без цифри все още е неудобно.

В C ++ (и тъй като C99, също и в C) можем да пишем "while (true)", но това е дори по-дълго от "while (1)", което само по себе си е по-дълго (с 1 знак), отколкото "for (;;) ".