for (;;) {
//Something to be done repeatedly
}
Я видел, как подобные вещи часто используются, но я думаю, что это довольно странно ... Разве не было бы намного яснее сказать while(true)
или что-то в этом роде?
Я предполагаю, что (как причина, по которой многие программисты прибегают к загадочному коду), это крошечный запас быстрее?
Почему и стоит ли это того? Если так, то почему бы просто не определить это так:
#define while(true) for(;;)
Смотрите также: Что быстрее: while (1) или while (2)?
c++
c
optimization
readability
infinite-loop
Крис Купер
источник
источник
TRUE
???TRUE
общего с C? Стандартный макрос для истинного результата boolen в C99 по-прежнемуtrue
. ОткудаTRUE
взялся?#define EVER ;;
хотя был использован в IOCCC, хотя .. :)#define while(TRUE)
объявления макроса, который принимает один вызываемый аргумент,TRUE
который никогда не используется, поэтому превращает каждый цикл while в вашей программе в бесконечный цикл?TRUE
происходит из заголовочных файлов, связанных с Windows API. Это никак не связано с VS 6.0. И, как я уже говорил, это не имеет ничего общего ни с C, ни с C ++. В C ++ «истинный» литерал простоtrue
(в VS 6.0 тоже), в C89 / 90 такого вообще нет, а в C99 это макросtrue
. Это относится ко всем компиляторам C / C ++.Ответы:
источник
Я предпочитаю
for(;;)
по двум причинам.Во-первых, некоторые компиляторы выдают предупреждения
while(true)
(что-то вроде «условие цикла является константой»). Избегать предупреждений всегда полезно.Другое - это то, что я считаю
for(;;)
более понятным и выразительным. Я хочу бесконечный цикл. Это буквально имеет не состояние, это зависит ни от чего. Я просто хочу, чтобы это продолжалось вечно, пока я не сделаю что-то, чтобы вырваться из этого.Тогда как с
while(true)
, ну, что правда, имеет отношение к чему-либо? Я не заинтересован в цикле, пока истина не станет ложной, что буквально говорит эта форма (цикл, пока истина истинна). Я просто хочу зациклить.И нет, нет абсолютно никакой разницы в производительности.
источник
for(;;)
, это будет выглядеть странно. Но я бы рекомендовал пытаться привыкнуть к нему , потому что это общая идиома, и вы собираетесь снова запустить в него. ;)for(;condition;)
. Это то , что в то время как петля является для . Но, как я сказал, с бесконечным циклом я не хочу, чтобы компилятор сравнивал какие-либо условия. Наивно, сwhile
циклом, это должно было бы проверятьtrue
каждую итерацию (очевидно, даже самый тупой компилятор не сделал бы это, но это принцип, который беспокоит меня. Это поразило меня как чрезмерное уточнение вашего кода), в то время как сfor(;;)
буквально вы говорите «Нет условий для проверки. Просто цикл». Я нахожу это наиболее близким к вашему воображаемому эквивалентуloop {...}
while(true)
выдает предупреждение.Лично я использую,
for (;;)
потому что там нет никаких цифр, это просто ключевое слово. Я предпочитаю, чтобыwhile (true)
,while (1)
,while (42)
, иwhile (!0)
т.д. и т.п.источник
true
не более магическое число, чемfor
волшебное ключевое слово илиfor(;;)
использует подразумеваемую магическую бесконечность. (while (42)
это действительно мерзость.)for(;;)
в любом случае разбирается быстрее, чем другие#define LIFE 42
while (LIFE)
:)while(true)
тоже не содержит никакого числа. и для (;;) это не ключевое словоИз-за Денниса Ричи
Я начал использовать,
for (;;)
потому что именно так Деннис Ритчи делает это в K & R, и при изучении нового языка я всегда стараюсь подражать умным парням.Это идиоматический C / C ++. Вероятно, в конечном итоге лучше привыкнуть к этому, если вы планируете многое делать в пространстве C / C ++.
Вы
#define
не сработаете, так как вещь # define'd должна выглядеть как идентификатор C.Все современные компиляторы генерируют одинаковый код для двух конструкций.
источник
while(TRUE)
, я подозреваю, что программист - новичок на C или изучил C из книги For Dummies.Это, конечно, не быстрее в любом нормальном компиляторе. Они оба будут скомпилированы в безусловные переходы. Версия for легче набрать (как сказал Нил) и будет понятна, если вы понимаете синтаксис цикла.
Если вам интересно, вот что дает мне gcc 4.4.1 для x86. Оба используют инструкцию JMP x86 .
компилируется в (частично):
источник
for_infinite
быстрее; На 2 персонажа меньшеputs
.Я предпочитаю,
for (;;)
потому что это наиболее последовательно в разных C-подобных языках.В C ++
while (true)
это хорошо, но в C вы зависите от определения заголовкаtrue
, ноTRUE
это также часто используемый макрос. Если вы используетеwhile (1)
это правильно в C и C ++ и JavaScript, но не в Java или C #, которые требуют, чтобы условие цикла было логическим, например,while (true)
илиwhile (1 == 1)
. В PHP ключевые слова нечувствительны к регистру, но язык предпочитает использование заглавных буквTRUE
.Тем не менее,
for (;;)
всегда полностью правильно во всех этих языках.источник
for (;;)
лучше.while (1)
иfor (;;)
являются общими идиомами для бесконечных циклов в C. Любой, кто читает программу на C, кто имеет проблемы с пониманием, вероятно, будет иметь проблемы с остальной частью кода. Не стоит писать код на C, который может быть легко прочитан кем-то, кто не знает C.Я лично предпочитаю
for (;;)
идиому (которая будет компилироваться в тот же код, что иwhile (TRUE)
.Использование
while (TRUE)
может быть более читабельным в некотором смысле, я решил использоватьfor (;;)
идиому, потому что она выделяется .Конструкция бесконечного цикла должна быть легко замечена или вызвана в коде, и я лично считаю, что
for (;;)
стиль делает это немного лучше, чемwhile (TRUE)
илиwhile (1)
.Также я напоминаю, что некоторые компиляторы выдают предупреждения, когда управляющее выражение цикла while является константой. Я не думаю, что это происходит слишком часто, но для того, чтобы я мог избежать этого, достаточно лишь потенциального использования ложных предупреждений.
источник
Я видел, что некоторые люди предпочитают это, потому что у них есть #define где-то вроде этого:
Что позволяет им написать это:
источник
FOREVER
определенfor(;;)
, но это не лучше. Макросы IMO не должны использоваться для «изобретения» нового языка.#define BEGIN {
и#define END }
. Я даже видел,#define DONKEYS_FLY (0)
чтобы они могли сказатьif DONKEYS_FLY ...
. Кто сказал, что софт скучный?#define never while(0)
и#define always
Как насчет (если ваш язык поддерживает это):
источник
goto
многочисленные недостатки, но, если алгоритм, который вы пытаетесь реализовать, исходит из блок-схемы, это самый прямой перевод.goto
goto
вам не нужно беспокоиться о том, чтобы кто-то добавил,break
чтобы сделать ваш цикл менее бесконечным. (если вы уже внутри другогоwhile
или вfor
цикле, конечно ...)Там нет никакой разницы с точки зрения машинного кода, который генерируется.
Тем не менее, просто чтобы уловить тенденцию, я бы сказал, что форма while (TRUE) гораздо более читабельна и интуитивно понятна, чем для (;;), и что читаемость и ясность являются гораздо более важными причинами для руководящих принципов кодирования, чем какие-либо причины, по которым я ' Я слышал о подходе for (;;) (я предпочитаю основывать свои руководящие принципы кодирования на здравом рассуждении и / или доказательстве эффективности самостоятельно).
источник
for(;;)
это традиционный способ сделать это в C и C ++.while(true)
кажется, соглашение в C # и Java и других языках. Ваш пробег может варьироваться.Не просто известный шаблон, но стандартная идиома в C (и C ++)
источник
while (true)
той же причине, что и ониif (true)
.генерирует предупреждение с Visual Studio (условие является постоянным). В большинстве мест, где я работал, компилируются производственные сборки с предупреждениями об ошибках. Так
является предпочтительным.
источник
Оба должны быть одинаковыми, если ваш код оптимизирован компилятором. Чтобы объяснить, что я имею в виду под оптимизацией, вот пример кода, написанного в MSVC 10:
Если вы строите его в режиме отладки ( без какой-либо оптимизации (/ Od) ), разборка показывает явную разницу. Есть дополнительные инструкции для
true
условия внутриwhile
.Однако, если вы строите свой код в режиме Release (с максимальной скоростью по умолчанию (/ O2) ), вы получите одинаковый вывод для обоих. Оба цикла сводятся к одной инструкции перехода.
То, что вы будете использовать, не имеет значения для достойного компилятора с включенной оптимизацией скорости.
источник
Это вопрос личных предпочтений, какой путь быстрее. Лично я сенсорный человек и никогда не смотрю на свою клавиатуру во время программирования - я могу коснуться всех 104 клавиш на моей клавиатуре.
Я найду, если быстрее набрать "while (TRUE)".
Я мысленно добавил некоторые измерения движения пальцев и суммировал их. «for (;;)» имеет около 12 значений ширины клавиш назад и четвертого (между клавишами «home» и клавишами, а также между клавишами «home» и клавишей SHIFT) «while (TRUE)» имеет около 14 значений ширины клавиш назад и четвёртый.
Тем не менее, я гораздо менее подвержен ошибкам при наборе последнего. Я мысленно думаю словами за один раз, поэтому я нахожу, что быстрее набирать такие слова, как «nIndex», чем аббревиатуры, такие как «nIdx», потому что я должен на самом деле мысленно произносить буквы, а не произносить их в уме, и пусть мои пальцы автоматически введите слово (например, езда на велосипеде)
(Мой тест TypingTest.com = 136 WPM)
источник
time head -10 >/dev/null
, введите каждые 10 раз и измерьте результаты. Бьюсь об заклад, вы будете быстрее,for(;;)
если вы не обманываете. Я был примерно на 14%.Все хорошие ответы - поведение должно быть точно таким же.
ОДНАКО - Просто предположим, что это имело значение. Предположим, что одна из них взяла еще 3 инструкции за итерацию.
Должны ли вы заботиться?
ТОЛЬКО если то, что вы делаете внутри цикла, почти ничего , а это почти никогда не так.
Я хочу сказать, что есть микрооптимизация и макрооптимизация. Микрооптимизация похожа на «стрижку, чтобы похудеть».
источник
++i
большеi++
?++i
иi++
может потенциально быть существенной, еслиi
это экземпляр класса, а не встроенный, и компилятор не применяет тривиальную оптимизацию. Совет состоит в том, чтобы приобрести привычку, чтобы она не застала вас врасплох.++i
против «i++
ничего» вам ничего не стоит делать «оптимизацию». Правда, в большинстве случаев это не имеет абсолютно никакого значения, но их одинаково легко набирать, так почему бы не предпочесть потенциально самый эффективный по умолчанию? И я предполагаю, что то же самое применимо и здесь. Если один был чуть-чуть быстрее другого, почему бы не пойти на более быстрый? Что бы мы потеряли, сделав это? Оба довольно легко читать и печатать.Я не могу себе представить, что достойный компилятор будет генерировать любой другой код. Даже если бы это было так, не было бы способа определить без тестирования конкретного компилятора, который был бы более эффективным.
Однако я предлагаю вам предпочесть
for(;;)
по следующим причинам:несколько компиляторов, которые я использовал, будут генерировать предупреждение о постоянном выражении для while (true) с соответствующими настройками уровня предупреждения.
в вашем примере макрос TRUE может быть определен не так, как вы ожидаете
Есть много возможных вариантов бесконечного цикла while, например
while(1)
,while(true)
иwhile(1==1)
т.д .; поэтомуfor(;;)
, скорее всего, приведет к большей согласованности.источник
while(TRUE)
оценивается как,while(0)
вряд ли выиграетfor(;;)
.while(true)
должно быть предпочтительным в любом случае. В C ++bool
зарезервировано, а в C определено в C stdbool.h (что делает его менее безопасным в C).for(;;)
удаляет все сомнения.Это яснее, чем:
Не то чтобы это применимо, если вы не используете
Sleep()
.источник
timerService.scheduleRepeating (50, [] () { /* lots of code */ });
Цикл "навсегда" популярен во встроенных системах как фоновый цикл. Некоторые люди реализуют это как:
И иногда это реализуется как:
И еще одна реализация:
Оптимизирующий компилятор должен генерировать такой же или похожий код сборки для этих фрагментов. Одно важное замечание: время выполнения для циклов не является большой проблемой, так как эти циклы продолжаются вечно, и в секции обработки тратится больше времени.
источник
Я предполагаю, что while (true) более читабельно, чем for (;;) - похоже, что программист пропускает что-то в цикле :)
источник
Наиболее важной причиной использования «for (;;)» является боязнь использования «while (TRUE)» при выполнении исследовательского программирования. Проще контролировать количество повторений с помощью «for», а также легче преобразовать цикл «for» в бесконечный.
Например, если вы создаете рекурсивную функцию, вы можете ограничить количество вызовов этой функции перед преобразованием в бесконечный цикл.
Когда я уверен в своей функции, я преобразую ее в бесконечный цикл:
источник