什么情况下使用do-while循环比while循环更好?

6

这是一个非常主观的问题,所以我会更具体一些。在编码时,有没有任何时间使用do-while循环比普通的while循环更好呢?

例如:

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

在执行do语句之后检查while条件(即强制运行do语句至少一次),对我来说似乎没有意义。

对于像上面示例那样简单的内容,我想象中应该是:

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

请问有人能够提供一个do-while循环是唯一或最佳选项的工作示例吗?你的代码中是否有do-while循环?它扮演了什么角色,为什么选择使用do-while循环?

(我有一种感觉,do-while循环在编写游戏时可能会有用。如果我错了,请纠正我,游戏开发者!)

一般来说,这样的内容应该被认为是以更好的写作风格书写的。


可能是为什么要使用“do while”循环?的重复问题。 - Bosko Mijin
@StephenC 当然,我会! - AlexMTMorgan
12个回答

6
while语句会在特定条件为真时不断执行一个代码块。
while (expression) {
     statement(s)
}

do-while 循环在循环底部计算其表达式,因此,do 块内的语句总是至少执行一次。

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

现在我们来谈一下功能上的区别,while循环由条件分支指令(例如if_icmpge或if_icmplt)和一个goto语句组成。条件指令将执行分支到循环后面的指令,并因此在条件不满足时终止循环。循环中的最后一条指令是一个goto,将字节码分支回循环的开头,确保字节码保持循环直到条件分支满足。 do-while循环与for循环和while循环非常相似,唯一不同的是它们不需要使用goto指令,因为条件分支是最后一条指令,可以用于循环返回到开头。do-while循环始终至少运行一次循环体 - 它跳过了初始条件检查。由于跳过了第一个检查,因此一个分支将少一个条件要评估。
通过使用do-while,如果表达式/条件复杂,则可以提高性能,因为至少确保循环一次。在这种情况下,do-while可能会提高性能
这里有非常令人印象深刻的发现: http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html#while_loop

6
如果你想从网络套接字中读取数据直到找到一个字符序列,你需要先读取数据,然后检查数据是否包含转义序列。
do
{ 
   // read data
} while ( /* data is not escape sequence */ );

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;
}

在从Http响应中读取输入流时。
    do 
    {
        bytesRead = inputStream.read(buffer, totalBytesRead, buffer.length - totalBytesRead);
        totalBytesRead += bytesRead;
    } while (totalBytesRead < buffer.length && bytesRead != 0);

1

do-while循环基本上是while循环的倒置版本。

它在第一次执行循环语句时无条件执行。

然后再评估在执行语句之前指定的条件表达式,以便再次执行语句。

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

参考资料


0

/* 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

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给出相同的输出,只是控制流不同

0

如果循环条件只能在循环的第一步之后才能确定(当您不想在进入循环之前设置条件)。

通常情况下:

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

你有没有一个例子? - AlexMTMorgan
1
例如,提示用户输入或从某些外部来源获取数据。 - Christophe Roussy
1
这里有一个例子:https://dev59.com/lHA75IYBdhLWcg3wVniI - Christophe Roussy

0

你有点自己回答了这个问题-当它需要至少运行一次,并且以那种方式阅读是有意义的。


0

do-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)

它会输出值大于10,因为条件是在循环执行后测试的。之后它不会再输出任何内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接