[英]What kind of loop is for (;;)?
在torvalds / linux-2.6.git中找到 - > kernel / mutex.c第171行
我試圖在谷歌上找到它,但無濟於事。
for (;;)
指示什么?
它的字面意思是“什么都不做,直到什么都沒發生,並且在每一步都沒有做任何事情來為下一步做好准備”。 基本上,它是一個無限循環,你必須使用break
, return
或goto
語句以某種方式從內部break
。
for(;;)是一個無限循環條件,類似於while(1),正如大多數人已經提到的那樣。 你經常會在內核互斥代碼中看到這個,或者像互聯網哲學家那樣的問題。 在將互斥變量設置為特定值之前,第二個進程可以訪問資源,第二個進程繼續循環,也稱為忙等待。 對資源的訪問可以是磁盤訪問,對於該訪問,2個進程正在競爭以使用互斥鎖獲得訪問權,使得一次只有一個進程可以訪問資源。
它是一個無限循環,沒有初始條件,沒有增量條件,沒有結束條件。 所以它將永遠迭代等同於while(1)。
它永遠循環(直到循環中的代碼調用break
或return
,當然。 while(1)
是等價的,我個人覺得使用它更合乎邏輯。
它相當於while( true )
編輯:由於我的回答引起了一些爭論(好的辯論,請注意),應該澄清的是,對於未寫入C99及更高版本的C程序,這並不完全准確,其中stdbool.h設置了值true = 1。
它是一個無限循環。
它與使用“for”語句編寫無限循環相同,但是你必須使用break或其他一些可以退出這個循環的語句。
對於(;;)
是一個無限循環,就像while(1)
。 這里沒有給出終止循環的條件。 如果你沒有使用break
語句打破它,這個循環將永遠不會結束。
它與while(true) { }
功能上是等同的。
for(;;)
語法有時候首選的原因來自較舊的年齡,其中for(;;)
實際編譯為稍快的機器代碼while(TRUE) {}
不是while(TRUE) {}
。 這是因為for(;;) { foo(); }
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條指令。
然而,在實踐中,這兩個語句早已不僅在功能上等同,而且實際上也是等效的,因為編譯器中除了調試構建之外的所有構建的優化將確保在while(1)
中優化mov
, cmp
和jnz
case,導致for(;;)
和while(1)
最佳代碼。
我的意思是:
#define EVER ;;
for(EVER)
{
// do something
}
警告:強烈建議不要在代碼中使用它。
這顯然是一個無限循環條件。
這是一個無限循環,你必須使用break,return或goto語句從內部以某種方式中斷。 或者發生一些中斷,否則這個循環將無限運行並且每次都執行;(null語句)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.