Какая петля для (;;)?
Найдено в torvalds/linux-2.6.git → kernel/mutex.c строка 171
Я попытался найти его в Google и безрезультатно.
Что указывает for (;;)
?
Ответы
Ответ 1
Условие for (;;) является условием бесконечного цикла, аналогичным (1), как уже упоминалось ранее. Вы бы чаще это видели в кодах ячеек мьютекса или в мьютексе, например, проблемах, таких как обеденные философы. До тех пор, пока переменная mutex не будет установлена на определенное значение, так что второй процесс получит доступ к ресурсу, второй процесс продолжит цикл, также известный как ожидание ожидания. Доступ к ресурсу может быть доступом к диску, для которого 2 процесса конкурируют, чтобы получить доступ с использованием мьютекса, так что только один процесс имеет доступ к ресурсу.
Ответ 2
Это буквально означает "ничего не делать, пока ничего не происходит и на каждом шаге ничего не делать, чтобы подготовиться к следующему". В принципе, это бесконечный цикл, который вам придется как-то нарушить, используя оператор break
, return
или goto
.
Ответ 3
Это бесконечный цикл, который не имеет начального условия, никакого условия приращения и никакого конечного условия. Таким образом, он будет повторяться навсегда, эквивалентный while (1).
Ответ 4
Он циклически навечно (пока код внутри цикла не вызовет break
или return
, конечно. while(1)
эквивалентен, я лично считаю более логичным использовать его.
Ответ 5
Это эквивалентно while( true )
Edit: Поскольку в моем ответе возникли некоторые споры (хорошие дискуссии, заметьте), следует уточнить, что это не совсем точно для программ на C, не написанных на C99 и выше, где stdbool.h установил значение true = 1.
Ответ 6
это бесконечный цикл.
Ответ 7
Это то же самое, что писать бесконечный цикл, используя оператор for for, но вам нужно использовать break или какой-либо другой оператор, который может выйти из этого цикла.
Ответ 8
I означает:
#define EVER ;;
for(EVER)
{
// do something
}
Предупреждение: использование этого в коде очень не рекомендуется.
Ответ 9
для (;;)
представляет собой бесконечный цикл, аналогичный while(1)
. Здесь не задано условие, которое завершит цикл. Если вы не нарушаете его с помощью инструкции break
, этот цикл никогда не подходит к концу.
Ответ 10
Он функционально эквивалентен 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
то есть.
lbl_for_ever:
call foo
jmp lbl_for_ever
Следовательно, сохранение 3 инструкций на каждом проходе цикла.
На практике, однако, оба утверждения уже давно не только функционально эквивалентны, но и фактически эквивалентны, поскольку оптимизация в компиляторе для всех построений, отличных от отладочных построений, гарантирует, что mov
, cmp
и jnz
оптимизированы в случае while(1)
, что приводит к оптимальному коду для for(;;)
и while(1)
.
Ответ 11
Это было, очевидно, бесконечное условие цикла.
Ответ 12
Это бесконечный цикл, который вам придется как-то нарушить, используя инструкцию break, return или goto.
или любое прерывание происходит иначе, этот цикл будет выполняться бесконечно и исполняется; (нулевой оператор) каждый раз