Еще в мои дни C / C ++, кодируя "бесконечный цикл" как
while (true)
казался мне более естественным и более очевидным, чем
for (;;)
Встреча с PC-lint в конце 1980-х и последующие обсуждения передового опыта избавили меня от этой привычки. С тех пор я закодировал циклы, используя for
оператор управления. Сегодня, впервые за долгое время и, возможно, первой моей потребности в бесконечном цикле в качестве разработчика C #, я столкнулся с той же ситуацией. Один из них правильный, а другой нет?
c#
infinite-loop
Боб Кауфман
источник
источник
while(true)
Требуется условие.for(;;)
поэтому это лучшее представление для бесконечных циклов, которые безоговорочно повторяются. 2. Старые неоптимизирующие компиляторы, возможно, действительно оценивали цикл(true)
. 3. C - это минималистский язык со времен телетайпов, терминалов на 300 бод и 1-символьных имен переменных. В среде, где учитывается каждое нажатие клавиши,for(;;)
это немного короче, чемwhile(true)
.Ответы:
Всегда то, что я использовал, и то, что я видел, как другие используют для цикла, который нужно разорвать вручную.
источник
Компилятор C # преобразует оба
и
в
CIL для обоих одинаковый. Большинству людей
while(true)
легче читать и понимать.for(;;)
довольно загадочный.Источник:
Я еще немного испортил .NET Reflector и скомпилировал оба цикла с помощью «Оптимизировать код» в Visual Studio.
Оба цикла компилируются (с .NET Reflector):
Скоро должны атаковать хищники.
источник
goto
оператору, кстати, что неудивительно.goto LOOP
что это правильный бесконечный цикл C # :)Я думаю, что это может быть проще для чтения, и это определенно стандарт для использования в C #:
источник
while(1)
недействителен в C #, поскольку1
не являетсяbool
.Gasp, используйте:
ИЛИ, как указал jsight , вы можете быть уверены вдвойне:
Пока на меня не кричали, это все тот же CIL-код, я проверил :)
источник
Перефразируя пару старых шуток:
for (;;) {}
" - это заставит заявление плакать.#define EVER ;;
".источник
#define ever (;;)
что мне кажется более читабельным.for ever {}
#define forever while(true)
Если вы хотите перейти на старую школу, goto по-прежнему поддерживается в C #:
Для действительно бесконечного цикла это команда перехода. знак равно
источник
Думаю,
while (true)
читабельнее.источник
В тех ситуациях, когда мне нужен был настоящий бесконечный цикл, я всегда использовал
Кажется, это лучше выражает намерение, чем пустой оператор for.
источник
Лично я всегда отдавал предпочтение
for(;;)
именно потому, что у него нет условия (в отличие от того,while (true)
которое имеет всегда верное условие ). Однако на самом деле это очень незначительный элемент стиля, о котором я не думаю, что стоит спорить в любом случае. Я еще не видел руководства по стилю C #, которое предписывало или запрещало любой подход.источник
while
". С точки зрения программиста, компилятор преобразует высокоуровневый код в IL. В IL нетwhile
(илиfor
) циклов, только метки и переходы.Лично я предпочитаю
for (;;)
идиому (с точки зрения C / C ++). Хотя я согласен с тем, чтоwhile (true)
это в некотором смысле более читабельно (и это то, что я использовал еще когда-то, даже в C / C ++), я обратился к использованиюfor
идиомы, потому чтоЯ думаю, что тот факт, что цикл не завершается (обычным образом), заслуживает внимания, и я думаю, что он
for (;;)
делает это немного больше.источник
for
вwhile
. Для обоихfor (;;){}
иwhile (true){}
он генерирует новыйwhile(true){}
код. Смотрите этот ответ .Оригинальная книга K&R для C, из которой C # может проследить его происхождение, рекомендовала
для бесконечных циклов. Он недвусмысленен, легко читается и имеет долгую и благородную историю.
Приложение (февраль 2017 г.)
Конечно, если вам кажется, что эта форма цикла (или любая другая форма) слишком загадочна, вы всегда можете просто добавить комментарий .
Или:
источник
Это должно быть
while(true)
неwhile(1)
такwhile(1)
неверен в C #, да;)источник
В качестве альтернативы можно было бы сказать, что наличие бесконечного цикла в любом случае обычно является плохой практикой, поскольку для него требуется условие выхода, если приложение действительно не работает вечно. Однако, если это для крылатой ракеты, я соглашусь, что явное условие выхода может не потребоваться.
Хотя мне нравится вот этот:
источник
f < 16777217f
всегдаfalse
... так что это никогда не зацикливается.Я предпочитаю чуть более «грамотный» код. На практике у меня гораздо больше шансов сделать что-то подобное:
источник
do ... while()
замаскированная петля. Мне потребовалось всего несколько секунд, чтобы увидеть это. Если бы вы написалиdo ... while()
цикл, это было бы понятно сразу. -1break
.Даже я также говорю, что ниже лучше :)
источник
Если вы играете в код-гольф, я бы посоветовал
for(;;)
. Помимо этого,while(true)
имеет то же значение и кажется более интуитивным. В любом случае, большинство программистов, вероятно, поймут оба варианта, так что это не имеет особого значения. Используйте то, что вам удобнее.источник
С точки зрения читабельности кода
while(true)
на любом языке, который я считаю более понятным. С точки зрения того, как это видит компьютер, в сегодняшнем обществе очень эффективных компиляторов и интерпретаторов не должно быть никакой разницы.Если есть какая-либо разница в производительности, я уверен, что перевод на MSIL будет оптимизирован. Вы можете проверить это, если действительно захотите.
источник
Единственная причина, которую я бы сказал
for(;;)
, связана с ограничениями CodeDom (в то время как циклы не могут быть объявлены с помощью CodeDom, а циклы for рассматриваются как более общая форма как цикл итераций).Это довольно слабая причина для выбора этого, кроме того факта, что
for
реализация цикла может использоваться как для обычного кода, так и для кода, созданного CodeDom. То есть может быть более стандартным.Обратите внимание, что вы можете использовать фрагменты кода для создания
while
цикла, но весь цикл должен быть фрагментом ...источник
Оба они выполняют одну и ту же функцию, но обычно люди предпочитают
while(true)
. Легко читать и понимать ...источник
Любое выражение, которое всегда возвращает истину, должно подходить для цикла while.
Пример:
источник