Какая петля для (;;)?

Найдено в 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. или любое прерывание происходит иначе, этот цикл будет выполняться бесконечно и исполняется; (нулевой оператор) каждый раз