2010-10-16 138 views
1

爲什麼有些人在他們的代碼中使用while(true){}塊?它是如何工作的?使用「while(true){...}」是什麼意思?

+0

因爲您希望有一個反覆運行的任務,並且沒有結束條件,除了程序結束之外。 – HoLyVieR 2010-10-16 00:26:40

+4

它被稱爲無限循環。也被稱爲加熱器。 – jcolebrand 2010-10-16 00:29:19

+0

什麼語言? (這個括號只是增加了足夠的字符來使StackOverflow接受評論 - 他們有一個愚蠢的規則,即註釋必須超過等號字符。) – 2010-10-16 00:29:40

回答

3

這是一個無限循環。在每次迭代中,條件將被評估。由於條件是true,總是......真的......循環將永遠運行。退出循環是通過檢查循環內部的東西來完成的,然後在必要時打破。

通過在循環內部放置break檢查,而不是將其用作條件,這可以讓您更清楚地知道,您期待這種檢查在發生某些事件之前運行。

這是一個常見的場景,在遊戲中;你希望繼續處理動作和渲染幀,直到遊戲結束。

+0

哦,真的,我猜是的!謝謝。 – trusktr 2010-10-16 00:31:19

2

while(條件){做函數} 當條件爲真..它會做的功能。

所以while(true) 條件總是爲真 它會繼續循環。

編碼將永遠不會進行。

+0

編碼可能會繼續,但不退出循環(比如使用'break'),處理將永遠不會在循環之外繼續。 – jcolebrand 2010-10-16 00:26:54

+0

我的意思是..如果他不使用任何關鍵字來打破循環,它將繼續循環。 – william 2010-10-16 00:47:13

7

這只是一個永遠不會結束的循環,被稱爲。 (很多時候,這是一件壞事。)

當它是空的時候,它會無限期地停止程序*;否則通常有一個在環路一些條件,真當,打破循環:

while (true) 
{ 
    // ... 

    if (stopLoop) 
     break; 

    // ... 
} 

這往往比輔助標誌清潔:

bool run = true; 
while (run) 
{ 
    // ... 

    if (stopLoop) 
    { 
     run = false; 
     continue; // jump to top 
    } 

    // ... 
} 

還要注意一些會建議for (;;)相反,各種原因。 (也就是說,它可能會擺脫類似於「條件表達總是如此」的警告。)

*在大多數語言中。

+3

這不是一個「停止」,而是「迅速轉換到位」。 – 2010-10-16 01:18:07

+0

@Jeremy:很好。 :)除非我將「halt」定義爲「不會執行超出'while循環'範圍的語句」,否則我會按原樣離開我的帖子。 :P – GManNickG 2010-10-16 01:53:00

1

這是一個永久運行的循環,除非在身體內部有一個break聲明。

5

不是東西在while語句中的所有可能的條件下,

// Always tests all conditions in loop header: 
while((condition1 && condition2) || condition3 || conditionN_etc) { 

    // logic... 

    if (notable_condition) 
     continue; // skip remainder, go direct to evaluation portion of loop 

    // more logic 
    // maybe more notable conditions use keyword: continue 
} 

有些程序員可能會認爲這是更好地把條件throughough邏輯,(即不循環頭球攻門稍稍內),並聘請break聲明在適當的地方出去。這種方法通常會否定確定何時離開循環的原始條件(即,而不是何時保持循環)。

// Always tests all conditions in body of loop logic: 
while(true) { 

    //logic... 

    if (!condition1 || !condition2) 
     break; // Break out for good. 

    // more logic... 

    if (!condition3) 
     break; 

    // even more logic ... 
} 

在現實生活中往往是一個更灰色混合物,所有這些東西的組合,而不是一個極化決定去這種或那種方式。

使用將取決於邏輯的複雜性和程序員的喜好..也許在此線程:)

的接受的答案也不要忘了do .. while。最終的解決方案可以使用該版本的while構造來將條件邏輯扭曲成他們的喜好。

do { 
    //logic with possible conditional tests and break or continue 
} while (true); /* or many conditional tests */ 

總之,作爲一名程序員可以有選擇。所以不要忘了感謝你的編譯器作者。

+3

我更喜歡'do {...} while(false);';) – jcolebrand 2010-10-16 00:40:02

+0

@drachenstern:很好。 – 2010-10-16 00:42:21

+0

@John K〜Lol,我認爲是這樣;)...正在等待某人對我上面的加熱器評論發表評論:p ~~另外,看看誰試圖爭論那個會很有趣......會愛知道誰花了不止一遍來弄清楚代碼的功能。 – jcolebrand 2010-10-16 00:51:33

2

Edsger W. Dijkstra年輕的時候,它等同於:

  Do loop initialization 
label a: 
     Do some code 
     If (Loop is stoppable and End condition is met) goto label b 
        /* nowadays replaced by some kind of break() */ 
     Do some more code, probably incrementing counters 
     go to label a 
label b: 
     Be happy and continue 

Dijkstra後決定成爲Antigotoist和程序員相信成羣這樣做,一個信仰來了在地球和代碼感實性明顯。

所以

Do loop initialization 
While (true){ 
    some code 
    If (Loop is stoppable and End condition is met) break(); 
    Do some more code, probably incrementing counters 
} 
Be happy and continue 

取代了憎惡。

對此不滿意,狂熱分子超過了。一旦證明,遞歸是更好的,更清晰,更普遍的是循環,而變量只是一個魔鬼般的化身,函數式編程,作爲一個夢想,終於成真:

Nest[f[.],x, forever[May God help you break]] 

因此,循環遞歸變得真的不可阻擋,或者至少是不可阻擋的。

1

真正的要點是,當(真){..}是當退出條件的語義沒有強烈的單一偏好,所以它對讀者說很好的方式,「好吧,實際上有休息條件A,B ,C ..,但條件的計算過於冗長,因此按照預期的出現概率順序將它們分別放入內部塊中。