簡體   English   中英

什么樣的循環是(;;)?

[英]What kind of loop is for (;;)?

在torvalds / linux-2.6.git中找到 - > kernel / mutex.c第171行

我試圖在谷歌上找到它,但無濟於事。

for (;;)指示什么?

它的字面意思是“什么都不做,直到什么都沒發生,並且在每一步都沒有做任何事情來為下一步做好准備”。 基本上,它是一個無限循環,你必須使用breakreturngoto語句以某種方式從內部break

for(;;)是一個無限循環條件,類似於while(1),正如大多數人已經提到的那樣。 你經常會在內核互斥代碼中看到這個,或者像互聯網哲學家那樣的問題。 在將互斥變量設置為特定值之前,第二個進程可以訪問資源,第二個進程繼續循環,也稱為忙等待。 對資源的訪問可以是磁盤訪問,對於該訪問,2個進程正在競爭以使用互斥鎖獲得訪問權,使得一次只有一個進程可以訪問資源。

它是一個無限循環,沒有初始條件,沒有增量條件,沒有結束條件。 所以它將永遠迭代等同於while(1)。

它永遠循環(直到循環中的代碼調用breakreturn ,當然。 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)中優化movcmpjnz case,導致for(;;)while(1)最佳代碼。

我的意思是:

#define EVER ;;

for(EVER)
{
     // do something
}

警告:強烈建議不要在代碼中使用它。

這顯然是一個無限循環條件。

這是一個無限循環,你必須使用break,return或goto語句從內部以某種方式中斷。 或者發生一些中斷,否則這個循環將無限運行並且每次都執行;(n​​ull語句)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM