Найдено в torvalds/linux-2.6.git -> kernel/mutex.c, строка 171.
Я пытался найти его в Google и т. д. безрезультатно.
Что for (;;)
инструктирует?
Найдено в torvalds/linux-2.6.git -> kernel/mutex.c, строка 171.
Я пытался найти его в Google и т. д. безрезультатно.
Что for (;;)
инструктирует?
for(;;) — это условие бесконечного цикла, похожее на while(1), как уже упоминалось. Вы чаще видели это в кодах мьютексов ядра или мьютексов, например, в таких проблемах, как обедающие философы. До тех пор, пока для переменной мьютекса не будет установлено определенное значение, так что второй процесс получит доступ к ресурсу, второй процесс будет продолжать зацикливаться, что также известно как ожидание занятости. Доступ к ресурсу может быть доступом к диску, за который 2 процесса конкурируют за получение доступа с использованием мьютекса, так что в каждый момент времени только один процесс имеет доступ к ресурсу.
Это буквально означает «ничего не делать, пока ничего не произойдет, и на каждом этапе ничего не делать, чтобы подготовиться к следующему». По сути, это бесконечный цикл, который вам придется как-то разорвать изнутри, используя оператор break
, return
или goto
.
Это бесконечный цикл, в котором нет начального условия, условия приращения и конечного условия. Таким образом, он будет повторяться вечно, эквивалентно while (1).
Он зацикливается вечно (конечно, пока код внутри цикла не вызовет break
или return
. while(1)
эквивалентно, лично я считаю более логичным использовать его.
Это эквивалентно while( true )
Изменить: поскольку мой ответ вызвал некоторые споры (хорошие дебаты, заметьте), следует уточнить, что это не совсем точно для программ C, не написанных для C99 и выше, где stdbool.h установил значение true = 1.
true
определено в stdbool.h
C99
- person AnT; 02.01.2010
nil
или ()
ложно, а все остальное верно. В Perl ""
является одним из возможных ложных значений.
- person David Thornley; 02.01.2010
это бесконечный цикл for.
Это то же самое, что написать бесконечный цикл с использованием оператора for, но вы должны использовать break или какой-либо другой оператор, который может выйти из этого цикла.
Я имею в виду:
#define EVER ;;
for(EVER)
{
// do something
}
Предупреждение. Крайне не рекомендуется использовать это в своем коде.
Функционально эквивалентен 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)
.
для(;;)
это бесконечный цикл, как и while(1)
. Здесь не задано условие, которое завершит цикл. Если вы не нарушите его с помощью оператора break
, этот цикл никогда не закончится.
Это бесконечный цикл, который вам придется как-то разорвать изнутри, используя операторы break, return или goto. либо происходит какое-то прерывание, иначе этот цикл будет работать бесконечно и будет выполняться (нулевой оператор) каждый раз
Очевидно, это было условие бесконечного цикла.
for(;;)
не является (обязательно) бесконечным циклом, это просто цикл, который не проверяет условие в самой конструкцииfor(...)
. Это особенно актуально в коде, указанном в OP - самый первый оператор внутри цикла -if (...) break;
, а также в цикле есть несколько других условных разрывов; в нем нет ничего бесконечного. - person Jim Balter   schedule 11.05.2011