【问题标题】:Difference between "while" loop and "do while" loop“while”循环和“do while”循环之间的区别
【发布时间】:2011-04-07 05:56:19
【问题描述】:

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 也会执行主体至少一次..
  • 两者都一样坏,因为它们都没有检查scanf()的返回值。

标签: c loops


【解决方案1】:

whiledo-while 循环之间最重要的区别在于,在do-while 中,代码块至少执行一次,即使给定的条件为假。

换一种说法:

  • 虽然 - 您的条件位于循环块的开头,并且可能永远不会进入循环。
  • 在 While 循环中,首先测试条件,如果测试结果为真,则执行代码块。

【讨论】:

    【解决方案2】:

    第 1 步中的 while 构造与 do while 之间的区别在于,无论 while() 子句中的条件如何,do {} 中的任何表达式都将至少运行一次。

    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

    【讨论】:

      【解决方案3】:

      While 循环:

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

      执行 While 循环:

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

      在此处了解有关此主题的更多信息:Difference Between While and Do While Loop

      这对于 C 编程、Java 编程和其他语言同样有效,因为概念保持不变,只是语法发生了变化。

      另外,另一个需要注意的小但不同的因素是 do while 循环在 while 条件的末尾包含一个 分号

      【讨论】:

        【解决方案4】:

        do while(退出检查)和while(进入检查)的区别在于,进入时do while不会检查,而in while会先检查

        例子是这样的:

        计划 1:

        int a=10;
        do{
        System.out.println(a);
        }
        while(a<10);
        
        //here the a is not less than 10 then also it will execute once as it will execute do while exiting it checks that a is not less than 10 so it will exit the loop
        

        计划 2:

        int b=0;
        while(b<10)
        {
        System.out.println(b);
        }
        //here nothing will be printed as the value of b is not less than 10 and it will not let enter the loop and will exit
        

        输出程序 1:

        10

        输出程序 2:

        [没有打印]

        注意:

        如果我们指定 a=0 和 b=0 并加上 a++,程序 1 和程序 2 的输出将相同;和 b++;在程序的相应主体中。

        【讨论】:

          【解决方案5】:

          在WHILE中先检查条件再执行程序 在 DO-WHILE 循环中首先执行程序至少一次然后检查条件

          【讨论】:

          • 晚了 6 年。该问题已有 12 个答案。
          【解决方案6】:
          while(wdlen<2){
            ...
           }  
          

          如果 wdlen(假设它是一个堆栈变量)在进入 while 循环之前没有初始化或赋值,它将包含之前内存中该空间中的任何内容(即垃圾)。因此,如果垃圾值

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

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

          【讨论】:

            【解决方案7】:

            在while循环中执行语句之前测试条件。

            在循环内执行语句之后进行条件测试。

            【讨论】:

            • 你没看错,但现在回答这个问题可能有点晚了?
            • 可能已经晚了,但我想用一个简单/简短的回答来回答他的问题
            【解决方案8】:

            whilewhile 循环中执行 语句 之前测试 条件

            do while在循环内执行语句后测试条件

            来源:让我们 C

            【讨论】:

            • 这个问题已经 3 年了,已经有答案了……+1 英雄。
            【解决方案9】:

            同时:

            1. 入口控制循环

            2. 循环执行前检查条件

            3. 条件为假时从不执行循环

            4. while 语句末尾没有分号

            执行时间:

            1. 退出控制循环

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

            3. 至少执行一次错误条件,因为稍后会检查条件

            4. while 语句末尾有分号。

            【讨论】:

              【解决方案10】:

              在退出控制循环中执行。 while 是一个入口控制循环。

              【讨论】:

                【解决方案11】:

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

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

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

                【讨论】:

                • "wdlen(假设从 0 开始)并且永远不会
                • 0
                • 谢谢哥们。我明白了。这两者还有什么不同吗?
                • 如果我是编译器并且 wdlen 不会被初始化,我会跳过整个块,因为如果它未定义,它可能总是 > 2。
                【解决方案12】:

                Do while 循环将至少执行一次......但是 while 循环将首先检查条件,然后它可能会或可能不会被执行,具体取决于条件。

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

                do while 循环将被执行,并会告诉你输入值并在终止条件下检查该值

                【讨论】:

                  【解决方案13】:
                  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&lt;2)...哎呀?
                  【解决方案14】:

                  不同之处在于条件被评估的时间。在do..while 循环中,直到每个循环结束时才会评估条件。这意味着do..while 循环将始终至少运行一次。在while 循环中,在开始时评估条件。

                  这里我假设wdlenwhile 循环开始时评估为假(即大于1),因此while 循环永远不会运行。在do..while 循环中,直到第一个循环结束才对其进行检查,因此您会得到预期的结果。

                  【讨论】:

                    【解决方案15】:

                    可能wdlen 以 >=2 的值开头,因此在第二种情况下,循环条件最初为 false,并且永远不会进入循环。

                    在第二种情况下,循环体在第一次检查wdlen&lt;2条件之前执行,因此printf/scanf至少执行一次。

                    【讨论】:

                    • 大于 2,我猜你的意思是?
                    • @Stephen: 是的,改变了 :)
                    • 嘿,抓得好。您的更改实际上使我在回答中发现了一个错误(我说过“它必须大于 2”!),所以干杯;)。
                    【解决方案16】:

                    While :您的条件位于循环块的开头,并且可能永远不会进入循环

                    Do While :您的条件位于循环块的末尾,并且必须至少进入循环一次

                    【讨论】:

                    • tnx 以获得良好的回放。只有一个区别??还有其他区别吗??
                    • @AminM 后者需要额外输入两个字符。
                    • 虽然有时几乎像 if 一样使用,因为当条件不为真时,循环永远不会进入,而循环内部是处理条件为真直到不再为真的代码。
                    • 还有其他编程语言,其中while ... do也写成while ... do,但do ... while写成repeat ... until。这更符合常见的英语语言。
                    猜你喜欢
                    • 1970-01-01
                    • 2016-04-01
                    • 1970-01-01
                    • 2015-07-03
                    • 2021-05-12
                    • 2016-07-08
                    • 2015-02-16
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多