Какой цикл для (;;)?

Найдено в torvalds/linux-2.6.git -> kernel/mutex.c, строка 171.

Я пытался найти его в Google и т. д. безрезультатно.

Что for (;;) инструктирует?


person user242294    schedule 02.01.2010    source источник
comment
это не полезный комментарий. То, что конманы не очень хорошо разбираются в C, не означает, что они не могут читать файлы кода. И теперь они чему-то научились, так что это хорошо.   -  person Alastair Pitts    schedule 02.01.2010
comment
Я согласен с Аластером. Чтение исходного кода, написанного другими, — отличный способ учиться.   -  person CesarGon    schedule 02.01.2010
comment
Если вы плохо разбираетесь в c, прочтите код ядра.   -  person just somebody    schedule 02.01.2010
comment
@Kim Несмотря на протесты, ваша точка зрения верна. Это правда, что ОП чему-то научился, но задав вопрос в SO, а не прочитав код ядра. Есть гораздо более эффективные способы обучения, чем читать код на языке, которого вы даже не знаете основ, а затем спрашивать SO о каждой мелочи, которую вы не понимаете.   -  person Jim Balter    schedule 11.05.2011
comment
P.S. Большинство ответов здесь вводят в заблуждение. for(;;) не является (обязательно) бесконечным циклом, это просто цикл, который не проверяет условие в самой конструкции for(...). Это особенно актуально в коде, указанном в OP - самый первый оператор внутри цикла - if (...) break;, а также в цикле есть несколько других условных разрывов; в нем нет ничего бесконечного.   -  person Jim Balter    schedule 11.05.2011


Ответы (12)


for(;;) — это условие бесконечного цикла, похожее на while(1), как уже упоминалось. Вы чаще видели это в кодах мьютексов ядра или мьютексов, например, в таких проблемах, как обедающие философы. До тех пор, пока для переменной мьютекса не будет установлено определенное значение, так что второй процесс получит доступ к ресурсу, второй процесс будет продолжать зацикливаться, что также известно как ожидание занятости. Доступ к ресурсу может быть доступом к диску, за который 2 процесса конкурируют за получение доступа с использованием мьютекса, так что в каждый момент времени только один процесс имеет доступ к ресурсу.

person Abhijit K Rao    schedule 02.01.2010
comment
Бесконечные циклы и занятые ожидания — разные вещи. Занятое ожидание — это бессонный цикл, ожидающий некоторого условия — в этом нет ничего бесконечного. - person Jim Balter; 11.05.2011
comment
@ Джим, честно говоря, ни один цикл не бесконечен, так как вы можете потерять питание в любой момент, или ваша машина умрет от старости. Он больше говорит о запросе у компилятора цикла без конечного условия, чем о чем-то бесконечном. - person Blindy; 08.08.2011
comment
@ Слепой способ упустить суть и в то же время быть абсурдно педантичным. Типа, я не знал о тепловой смерти Вселенной. Между тем, занято ожидание, как я уже сказал, бессонно, и имеет конечные условия. - person Jim Balter; 09.08.2011

Это буквально означает «ничего не делать, пока ничего не произойдет, и на каждом этапе ничего не делать, чтобы подготовиться к следующему». По сути, это бесконечный цикл, который вам придется как-то разорвать изнутри, используя оператор break, return или goto.

person Blindy    schedule 02.01.2010

Это бесконечный цикл, в котором нет начального условия, условия приращения и конечного условия. Таким образом, он будет повторяться вечно, эквивалентно while (1).

person M. Atif Riaz    schedule 02.01.2010
comment
по крайней мере один компилятор, которого я знаю, предупредит о циклах while ( 1 ) или while ( true ), но не будет производить диагностику для ( ; ; ), поскольку он считается стандартной формой для бесконечного цикла. - person Peeter Joot; 02.01.2010

Он зацикливается вечно (конечно, пока код внутри цикла не вызовет break или return. while(1) эквивалентно, лично я считаю более логичным использовать его.

person Wim    schedule 02.01.2010
comment
Либо вызывает exit, либо longjmp, либо выполняет переход из цикла, либо (POSIX) до тех пор, пока не появится сигнал, который не возвращается. Также цикл может завершиться различными видами неопределенного поведения, а также различными внешними событиями, выходящими за рамки языка C, включая сброс ядерной бомбы на компьютер, на котором запущена программа. - person Jim Balter; 11.05.2011

Это эквивалентно while( true )

Изменить: поскольку мой ответ вызвал некоторые споры (хорошие дебаты, заметьте), следует уточнить, что это не совсем точно для программ C, не написанных для C99 и выше, где stdbool.h установил значение true = 1.

person wheaties    schedule 02.01.2010
comment
Им нужна система понижения комментариев. - person Blindy; 02.01.2010
comment
Эй, чувак, он просто пытается убедиться, что люди защитят свои приложения от возможности ценности «истинного» изменения. - person Frank Farmer; 02.01.2010
comment
Тьфу, боль языка, где 1 является более авторитетным значением True, чем логическое значение true. - person Clueless; 02.01.2010
comment
@Blindy: Почему вы понизили его комментарий? @Frank: Меняется с чего? true не определен в стандарте C. - person sepp2k; 02.01.2010
comment
В большинстве языков true означает !0 - person Ton Plomp; 02.01.2010
comment
@GregS: Нет. При условии, что true != 0 :) - person AnT; 02.01.2010
comment
@ sepp2k: true определено в stdbool.h C99 - person AnT; 02.01.2010
comment
Хорошо, достаточно честно, но я сомневаюсь, что ядро ​​Linux использует C99. - person sepp2k; 02.01.2010
comment
Действительно ли стоит спорить? И я не вижу причин для понижения этого ответа (я вижу, что за этот ответ проголосовали отрицательно). Комментарий GregS может быть засчитан как вклад в ответ. И мы предоставили информацию о том, что true не определено в некоторых версиях C. - person JCasso; 02.01.2010
comment
@Ton: В большинстве языков true не означает !0. У большинства из них есть понятия «истина/ложь», которые не являются просто арифметическими операциями или значениями, и те, у которых часто нет других понятий. В Common Lisp nil или () ложно, а все остальное верно. В Perl "" является одним из возможных ложных значений. - person David Thornley; 02.01.2010
comment
+1, чтобы противостоять незаслуженному (особенно после редактирования) отрицательному голосу. - person Jim Balter; 11.05.2011

это бесконечный цикл for.

person GuruKulki    schedule 02.01.2010

Это то же самое, что написать бесконечный цикл с использованием оператора for, но вы должны использовать break или какой-либо другой оператор, который может выйти из этого цикла.

person Swapnil    schedule 02.01.2010

Я имею в виду:

#define EVER ;;

for(EVER)
{
     // do something
}

Предупреждение. Крайне не рекомендуется использовать это в своем коде.

person JCasso    schedule 02.01.2010
comment
Я действительно ненавижу, когда вижу такой код. Автор, очевидно, думает, что он более ясен, но мне часто приходится возвращаться и следить за тем, чтобы КОГДА-ЛИБО не определялось как что-то плохое, что вызовет у меня проблемы. - person Fredrik; 02.01.2010
comment
Правда, я бы тоже не стал писать for(EVER) в своем коде. Это просто для удовольствия :) - person JCasso; 02.01.2010

Функционально эквивалентен while(true) { }.

Причина, по которой синтаксис for(;;) иногда предпочтительнее, кроется в более старшем возрасте, когда for(;;) на самом деле компилировался в несколько более быстрый машинный код, чем while(TRUE) {}. Это связано с тем, что for(;;) { foo(); } при первом проходе компилятора преобразуется в:

lbl_while_condition:
   mov $t1, 1
   cmp $t1, 0
   jnz _exit_while
lbl_block:
   call _foo
   jmp lbl_while_condition

тогда как for(;;) будет компилироваться на первом проходе в:

lbl_for_init:
   ; do nothing
lbl_for_condition:
   ; always
lbl_for_block:
   call foo;
lbl_for_iterate:
   ; no iterate
   jmp lbl_for_condition

i.e.

 lbl_for_ever:
    call foo
    jmp lbl_for_ever

Следовательно, сохранение 3 инструкций при каждом проходе цикла.

На практике, однако, оба утверждения уже давно не только функционально эквивалентны, но и фактически эквивалентны, поскольку оптимизации в компиляторе для всех сборок, кроме сборок отладки, гарантируют, что mov, cmp и jnz будут оптимизированы в случае while(1), в результате чего в оптимальном коде как для for(;;), так и для while(1).

person SecurityMatt    schedule 05.12.2012

для(;;)

это бесконечный цикл, как и while(1). Здесь не задано условие, которое завершит цикл. Если вы не нарушите его с помощью оператора break, этот цикл никогда не закончится.

person पवन    schedule 27.09.2012

Это бесконечный цикл, который вам придется как-то разорвать изнутри, используя операторы break, return или goto. либо происходит какое-то прерывание, иначе этот цикл будет работать бесконечно и будет выполняться (нулевой оператор) каждый раз

person Anshul garg    schedule 28.11.2011

Очевидно, это было условие бесконечного цикла.

person deddihp    schedule 11.03.2010