2013-12-09 162 views
5

這是一個非常主觀的問題,所以我會更具體。有沒有什麼時候do-while循環會比正常的while循環更好的編碼風格?什麼時候do-while循環比while循環更好?

例如

int count = 0; 
do { 
    System.out.println("Welcome to Java"); 
    count++; 
} while (count < 10);` 

它似乎沒有意義,我評估DO語句(又名迫使do語句至少運行一次)後檢查時的狀態。

對於一些簡單的像我上面的例子中,我會想象:

int count = 0; 
while(count < 10) { 
    System.out.println("Welcome to Java"); count++; 
} 

將被普遍認爲有一個更好的寫作風格被寫入。

任何人都可以給我一個工作的例子,當一個do-while循環被認爲是唯一的/最好的選擇?你的代碼中有一個do-while循環嗎?它扮演着什麼角色?你爲什麼選擇do-while循環?

(我有一個暗示的感覺是,do-while循環可能是編碼遊戲中使用的。指正,遊戲開發商,如果我錯了!)

+0

可能重複的[爲什麼使用「do while」循環?](http://stackoverflow.com/questions/3003456/why-use-a-do-while-loop) –

+0

@StephenC的確我是這樣做的! – AlexMTMorgan

回答

3

如果要從網絡套接字讀取數據直到找到字符序列,首先需要讀取數據,然後檢查轉義序列的數據。

do 
{ 
    // read data 
} while (/* data is not escape sequence */); 
0

如果循環條件下只能被稱爲在循環的第一步之後(當您在進入循環之前不需要條件時)。 典型:

do { 
    expr = ...; 
while (expr); 
+0

你也許有一個例子嗎? – AlexMTMorgan

+1

例如提示用戶輸入或某些外部來源。 –

+1

這裏有一個例子:http://stackoverflow.com/questions/3347001/do-while-vs-while –

1

簡單地說,當你想前檢查情況,然後進行操作while是更好的選擇,如果你想執行操作至少一次然後檢查條件do-while更好。
根據你的問題的工作示例,
1.當我需要找到可能在同一類或超類或超類,父類被宣佈爲field等即找到現場位於深層次的階層。 (A extends BB extends C等)

public Field SearchFieldInHierarchy(Object classObj, String fieldName) 
{ 
    Field type = null; 
    Class clz = classObj.getClass(); 
    do 
    { 
     try 
     { 
      type = clz.getDeclaredField(fieldName); 
      break; 
     } catch (NoSuchFieldException e) 
     { 
      clz = clz.getSuperclass(); 
     } 
    } while(clz != null || clz != Object.class);   
    return type; 
} 

2.當從Http響應讀取輸入流

do 
    { 
     bytesRead = inputStream.read(buffer, totalBytesRead, buffer.length - totalBytesRead); 
     totalBytesRead += bytesRead; 
    } while (totalBytesRead < buffer.length && bytesRead != 0); 
+0

任何原因的投票??? – dbw

0

你有種自己回答,當它需要至少運行一次的問題,閱讀它是有道理的。

1

do-while循環基本上是while循環的反轉版本。

它首次無條件執行循環語句。

然後它再次執行語句之前評估指定的條件表達式。

int sum = 0; 
int i = 0; 
do 
{ 
    sum += ids[i]; 
    i++; 
} while (i < 4); 

Reference material

0

做 - while循環可以讓你以確保其進入迭代前的一段代碼至少執行一次。

0

while循環中,條件在執行循環中的代碼之前進行了測試。在do while循環中,代碼在測試條件之前執行,導致代碼始終至少執行一次。例如:

$value = 5; 

while($value > 10){ 
    echo "Value is greater than 10"; 
} 

上面不會輸出任何東西。如果我們再次做同樣的是這樣的:

$value = 5; 

do{ 
    echo "Value is greater than 10"; 
}while($value > 10) 

這將輸出Value is greater than 10因爲測試條件後,循環執行。之後它不會輸出任何東西。

4

而特定條件爲真

while (expression) { 
    statement(s) 
} 

do-while在循環底部評估其表達while語句連續執行語句塊,並因此,do塊內的語句總是至少執行一次。

do { 
    statement(s) 
} while (expression); 

現在就說說功能上的差異,

while-loops包含的條件分支指令,如if_icmpge或if_icmplt和goto語句。條件指令在循環之後立即將執行分支爲指令,因此如果條件不滿足則終止循環。循環中的最後一個指令是goto,它將字節碼分支回到循環的開始,以確保字節碼保持循環,直到符合條件分支。

一個Do-while-loops也非常相似,for循環和while循環不同的是條件分支是最後的指令,並用於循環回到開始 一個做,而他們不需要跳轉指令循環總是運行循環體至少一次 - 它跳過了初始條件檢查。由於它跳過第一次檢查,所以一個分支將會少一些,並且要評估一個條件。

通過使用do-while如果表達式/條件複雜,則可以獲得性能,因爲它確保至少循環一次。在這種情況下do-while could call for performance gain

非常令人印象深刻的發現在這裏, http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html#while_loop

0

使用while語句時,你必須反覆只檢查一個條件,當條件滿足執行循環

while(condition) //eg. a>5 
{ 
Body of Loop 
} 
  • 如果您在此看到控制流程,則可以看到在執行循環之前檢查了條件,如果條件未滿足,則循環將不會執行

在do-while語句如果你在這裏發現控制流的程序將執行一次循環體,然後將檢查語句是真還是假

do 
    { 
Body of Loop 
} 

while(condition); //eg. a>5 
  • 你會看到身體被執行一次,然後檢查條件。如果條件爲False,則程序將跳出循環,如果爲True,則它將繼續執行,直到條件不成立爲止
  • 需要注意的是,while和do-while只給出相同的輸出,而控制流程是不同
1

/* while循環

5雄鹿

1巧克力= 1個雄鹿

while my money is greater than 1 bucks 
    select chocolate 
    pay 1 bucks to the shopkeeper 
    money = money - 1 
end 

來家裏不能去,同時店,因爲我的錢= 0雄鹿 */

#include<stdio.h> 
int main(){ 
    int money = 5; 

    while(money >= 1){ 
    printf("inside the shopk and selecting chocolate\n"); 
    printf("after selecting chocolate paying 1 bucks\n"); 
    money = money - 1 ; 
    printf("my remaining moeny = %d\n", money); 
    printf("\n\n"); 
    } 

    printf("dont have money cant go inside the shop, money = %d", money); 

    return 0; 
} 

無限錢

while(codition){ // condition will always true ....infinite loop 
    statement(s) 
} 

請訪問該視頻爲更好地理解 https://www.youtube.com/watch?v=eqDv2wxDMJ8&t=25s