2013-12-09 161 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