2010-06-09 201 views
7

我從來沒有理解爲什麼使用做,而循環是必要的。我明白他們在做什麼,哪個是執行while循環包含的代碼,而不檢查條件是否爲真。爲什麼使用「do while」循環?

但不是下面的代碼:

do{ 
    document.write("ok"); 
} 
while(x == "10"); 

確切一樣:

document.write("ok"); 
while(x == "10"){ 
    document.write("ok"); 
} 

也許我是非常愚蠢和缺少明顯的東西出來,但我沒有看到使用的好處,而我的上面的例子則使用

+6

Dupe of http://stackoverflow.com/questions/994905/is-there-ever-a-need-for-a-do-while-loop – sharptooth 2010-06-09 06:22:10

回答

14

你的示例代碼是錯誤的:

do{ 
    document.write("ok"); 
}while(x == "10"){ 
    document.write("ok"); 
} 

這將是實際的形式:

do { 
    document.write("ok"); 
} while(x == "10"); 

你是正確的,它簽入之前執行的內部代碼塊g的條件,但它不需要按照你的方式複製內部代碼塊。 do/while結構(正如你已經說過的)確保一段代碼被執行一次或多次而不是0次或多次(取決於條件)。

+0

我現在看到,我沒有意識到它可以節省你表單必須複製內部代碼。謝謝您的幫助。 – Stanni 2010-06-09 06:27:03

6

做,而將至少運行一次 - 讓你做什麼,而...其中作爲同時需要滿足的條件在所有啓動..

var i = 6; 
do{ 
    alert(i); 
}while(i < 5) 

// alerts 6, but while criteria isn't met so it stops 

var i = 6; 
while(i < 5) { 
    alert(i); 
} 

// no output - while condition wasn't met 
2

當至少有一行代碼被執行至少一行時,區別是最重要的。用while循環模擬do循環會導致大量的代碼重複,這總是很糟糕。當然,更好的解決方案是將該代碼重構爲一個方法,然後在循環之前和循環中簡單地進行相同的方法調用,但是許多人不喜歡這種重複,並且使用關鍵字明確聲明「這是一個腳控循環」。

因此,基本上,可讀性和基本的SE原則。

1

你缺少的是你使用上面的do...while是100%錯誤

一個do...while循環在Java中,例如,看起來是這樣的:

do { 
    //something you want to execute at least once 
} while (someBooleanCondition); 

請參閱完全沒有第二塊有嗎?看看while如何完全結束的聲明?那麼現在發生的是和while之間的{...}對中的代碼將得到執行,然後someBooleanCondition將得到測試,如果它是真的,代碼塊將再次執行。然後再次。然後再次。直到someBooleanCondition被測試爲假。

在這一點上,也許你會明白爲什麼我們有兩種形式的循環。上面的代碼可以被翻譯成:

//something you want to execute at least once 
while (someBooleanCondition) { 
    //something you want to execute at least once 
} 

此代碼,但是,要求您兩次鍵入相同的(潛在的巨大和複雜)的代碼,使門打開更多的錯誤。因此需要底部測試循環而不是頂部測試循環。

1

首先你的do..while語法是錯誤的。它是這樣的:

do 
{ 
    document.write("ok"); 
}while(x=="10"); 

當你想要執行循環的主體至少一次而沒有評估它的終止條件時它是有用的。例如,假設您想要編寫一個循環,提示用戶輸入並根據輸入執行一些代碼。你會希望這個至少執行一次,然後詢問用戶他是否想繼續。在這種情況下,與while循環相比,do..while循環會產生更少且更乾淨的代碼。

16
  • 正如你看到的,你不得不重複相同線在第二個例子。 當你保持,你很可能希望這兩條線是相同的,但你有自己重複

  • 現在想象一下,這是一個大塊,而不是一條線,不僅會冒不必要的寶貴視覺空間,但它也將是難以維持,吸引不一致

0

其編寫代碼更好的方法:

int count = ReadDataFromStream(); 
while(count != 0) 
{ 
    count = ReadDataFromStream(); 
} 

可以用做,而作爲被寫成:

int count = 0; 
do 
{ 
    count = ReadDataFromStream(); 
} while(count != 0); 

有做,而更好的例子,但我做不到回憶在這個時候。

2

什麼:

do{ 

    //..... 
    // 100000 lines of code! 
    //..... 

} while(i%10); 




當然你不會寫:

//..... 
// 100000 lines of code! 
//..... 

while(i%10){ 

    //..... 
    // 100000 lines of code! 
    //..... 

} 



然後你將被迫使用do-while循環
上帝保佑它!

編輯:
或者你會使用程序..

+0

什麼語言有做,但沒有程序? – 2010-06-09 07:58:00

+0

你可能會把100000行代碼放入一個函數中......但要點。 – 2012-11-13 18:25:11

0

雖然

do { 
    s1; 
    ... 
    sn; 
} while (p); 

可以寫成

boolean done = false; 
while (!done) { 
    s1; 
    ... 
    sn; 
    done = !p; 
} 

前者更容易理解。