"While"循环和"do while"循环的区别

41

while循环和do-while循环有什么区别?我曾经认为两者完全相同。然后我看到了以下代码:

do {
        printf("Word length... ");
        scanf("%d", &wdlen);
    } while(wdlen<2);

这段代码完美地工作了。它打印出单词长度并扫描输入。但是,当我将其更改为

while(wdlen<2){
        printf("Word length... ");
        scanf("%d", &wdlen);
    } 

它给出了一个空白屏幕。它不起作用。因此,这两个循环之间存在某些功能差异。有人能解释一下吗?

除了这两个之间是否还有其他差异?


while循环在最初检查条件,然后执行...但是do-while即使条件为假也会执行至少一次。 - Raghu Srikanth Reddy
两者都是一样的糟糕,因为它们都没有检查 scanf() 的返回值。 - Nisse Engström
16个回答

68

do while循环会在检查while条件之前执行一次循环内容。

相反,while循环会在执行循环内容之前先检查条件。

在这种情况下,您使用scanf()等待用户输入,在while循环中它永远不会执行,因为wdlen尚未初始化,可能仅包含垃圾值,该值可能大于2。


wdlen(假定从0开始)永远不会小于2 - 在我的数学课上,我被教导0 < 2;-) - Péter Török
0 < 2 == false?你确定吗? - Joost
谢谢伙计。我明白了。这两者还有其他的区别吗? - narayanpatra
2
如果我是一个编译器,而wdlen没有被初始化,我会跳过整个块,因为如果它未定义,那么它可能总是> 2。 - AndreKR

21

While: 在循环块的开始处设置条件,有可能导致永远不进入循环

Do While: 在循环块的末尾设置条件,至少会执行一次循环


谢谢你的好回复。只有一个区别吗?还有其他的区别吗? - AminM
@AminM 后者需要额外输入两个字符。 - user4734394
while有时候被用作if的替代,因为当条件不成立时,循环体永远不会执行,并且在循环体内部编写的代码可以处理条件成立的情况,直到条件不再成立。 - Alan Corey
还有其他编程语言,其中 while ... do 也被写成 while ... do,但 do ... while 则被写成 repeat ... until。这更符合常见的英语语言习惯。 - Dominique

3
do {
    printf("Word length... ");
    scanf("%d", &wdlen);
} while(wdlen<2);

一个 do-while 循环保证循环至少执行一次,因为它在循环迭代之后检查循环条件。因此它会打印字符串并调用 scanf ,从而更新 wdlen 变量。
while(wdlen<2){
    printf("Word length... ");
    scanf("%d", &wdlen);
} 

关于 while 循环,它在执行循环体之前先评估循环条件。在你的代码中,wdlen 可能一开始就大于2,这就是为什么你从未到达循环体的原因。


可能起始长度小于2... while(wdlen<2)... 哎呀? - Stephen

3

do-while 是一个出口控制循环,而 while 是一个入口控制循环。


3

While循环:

  1. 进入循环之前检查条件

  2. 如果条件为false,就不会执行循环

  3. 在while语句末尾没有分号

Do-while循环:

  1. 退出循环之前检查条件

  2. 在循环结束时检查条件

  3. 至少执行一次false条件,因为条件是在后面检查的

  4. 在while语句的末尾有分号。


2
区别在于条件何时被评估。在do..while循环中,条件不会被评估直到每次循环结束。这意味着do..while循环将始终至少运行一次。在while循环中,条件在开始时被评估。
在这里我假设wdlenwhile循环开始时评估为false(即它大于1),因此while循环永远不会运行。在do..while循环中,它直到第一次循环结束才被检查,因此您得到了期望的结果。

1
while(wdlen<2){
  ...
 }  

如果wdlen(假设它是一个堆栈变量)在进入while循环之前没有初始化或赋值,则它将包含先前内存中的任何内容(即垃圾)。因此,如果垃圾值小于2,则循环执行,否则不执行。
do{
 ...
}while(wdlen<2)

将执行一次,然后检查条件以再次运行循环,如果偶然发现未初始化的wdlen小于2,则这次可能会成功。


1

do while循环将至少执行一次......但是while循环将首先检查条件,然后根据条件可能会或可能不会执行。

在您的示例中,wdlen可能会假设任何垃圾值,该值大于2,因此while循环永远不会被执行。

do while循环将被执行,并告诉您输入该值并检查终止条件中的该值


0

While循环:

while(test-condition)
{
      statements;
      increment/decrement;
}
  1. 降低执行时间和速度
  2. 有条件的循环
  3. 没有固定的迭代次数

Do While Loop:

do
{
      statements;
      increment/decrement;
}while(test-condition);
  1. 更高的执行时间和速度
  2. 退出条件循环
  3. 最少一个迭代次数

在这个主题上了解更多信息请点击此处:While循环和Do While循环的区别

这对C编程、Java编程和其他语言都适用,因为概念是相同的,只有语法不同。

另外,需要注意的另一个小但有区别的因素是,do while循环在while条件结尾处有一个分号


0
Step 1 中 while 结构和 do while 的不同之处在于,do {} 内的任何表达式都将至少运行一次,而不管 while() 子句中的条件如何。
println("\nStep 2: How to use do while loop in Scala")
var numberOfDonutsBaked = 0
do {
  numberOfDonutsBaked += 1
  println(s"Number of donuts baked = $numberOfDonutsBaked")
} while (numberOfDonutsBaked < 5)

以下是详细的解释:Explanation 访问:coderforevers


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