为什么要使用“do while”循环?

13

我从来没有理解为什么需要使用do while循环。我了解它们的作用,即在不首先检查条件是否为真的情况下执行while循环中包含的代码。

但是下面的代码不是吗:

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

完全相同:

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

也许我很愚蠢,错过了一些显而易见的东西,但我看不出使用do while比上面的例子有什么好处。


6
需要翻译的内容:Dupe of http://stackoverflow.com/questions/994905-is-there-ever-a-need-for-a-do-while-loop这是一个重复问题,询问是否有必要使用do-while循环。 - sharptooth
9个回答

19
  • 如您所见,在第二个示例中,您不得不重复相同的一行。 在维护时,您可能希望这两行都相同,但是您已经重复了自己

  • 现在想象一下那是一个大块而不是一行,它不仅会占用不必要的宝贵的视觉空间,还会更加难以维护并吸引不一致性


简单,把它放在一个函数里:D - Niels Lucas
@NielsLucas 确实如此,但您也希望避免在各个地方散布大量小函数。但我同意,“do while”的优势并不大。 - Anakhand
@Anakhand,你不使用对象吗?对象(无论使用何种设计模式)应包含与对象相关的可重用函数。因此,我同意“避免在各处散布许多小函数”,但我希望现在的人们使用对象。 - Niels Lucas

15

您的示例代码有误:

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

这将是实际的表单:

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

你说得对,它在检查条件之前执行内部代码块,但是它不需要像你写的那样复制内部代码块。正如你已经说明的那样,do/while结构是确保代码块执行1次或更多次而不是0次或更多次(取决于条件)的方法。


我现在明白了,我没有意识到它可以避免你重复内部代码。感谢您的帮助。 - Stanni

6

关于:

do{

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

} while(i%10);

当然,你不会写出这样的内容:




当然,您不会编写这样的内容:

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

while(i%10){

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

} 



然后你就必须使用一个do-while循环
上帝保佑它!!

编辑:
或者你将使用程序..


1
哪些编程语言具有do-while但没有过程? - Pete Kirkham
你可以将这10万行代码放入一个函数中...但理解到了。 - David C

5

do while语句至少会运行一次——让您在满足条件之前一直执行,而while需要满足条件才能开始执行。

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

3

这是一种更好的编写代码的方式:

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

可以使用 do-while 编写如下代码:
int count = 0;
do
{
    count = ReadDataFromStream();
} while(count != 0);

有更好的do-while示例,但我目前无法回想起来。


2
虽然
do { 
    s1;
    ...
    sn;
} while (p);

可以写成

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

前者更易懂。


这是我有点想念 Python 中没有 do while 的少数情况之一。(尽管在大多数具有此功能的语言中,p 仍然必须在 do 范围之外声明,对吧?) - Anakhand

2
区别在于当你有多行代码需要至少执行一次时,这一点非常重要。用 while 循环模拟 do 循环将导致大量代码重复,这总是不好的。当然,更好的解决方案是将该代码重构为一个方法,然后在循环之前和循环中简单地调用相同的方法,但许多人甚至都不喜欢这么多的重复,而使用“do”关键字明确声明“这是一个由脚控制的循环”。因此,基本上就是可读性和基本 SE 原则。

1

首先,你的do..while语法是错误的。正确的写法应该是:

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

当你想要至少执行一次循环体而不评估其终止条件时,它非常有用。例如,假设你想要编写一个循环,在其中提示用户输入,并根据输入执行一些代码。你希望这个循环至少执行一次,然后询问用户是否想要继续。在这种情况下,do..while 循环相对于 while 循环来说,能产生更少、更清晰的代码。


1
你所忽略的是,你上面使用的 do...while 是 100% 错误的!
例如,在 Java 中,do...while 循环看起来像这样:
do {
  //something you want to execute at least once
} while (someBooleanCondition);

看到那里完全没有第二个块吗?看到while如何完全结束语句了吗?所以现在发生的是,在dowhile之间的{...}对中的代码将被执行,然后将测试someBooleanCondition,如果它为真,则代码块将再次被执行。一遍又一遍。直到someBooleanCondition被测试为假。

也许此时,您会理解为什么我们有两种循环形式。上面的代码可以翻译为:

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

然而,这段代码要求您输入相同的(可能是大而复杂的)代码两次,这样会留下更多的错误空间。因此需要使用底部测试循环而不是顶部测试循环。


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