【问题标题】:When is a do-while appropriate?什么时候做一个合适的?
【发布时间】:2010-11-05 08:01:16
【问题描述】:

什么时候 do-while 比其他类型的循环更好?有哪些常见的场景比其他的更好?

我了解 do-while 的功能,但不了解何时使用它。

【问题讨论】:

  • 我确定我以前见过这个问题。但是找不到骗子。
  • @Hardwareguy 一点也不。当我在做一些我在整个项目中没有使用过的东西时,我突然想到了。
  • 是的,我发现我几乎从不使用它。即使在某些情况下,我知道在检查条件之前必须执行一次循环,但第一次迭代在某种程度上是一种特殊情况,因此将它完全放在循环块之外更有意义。
  • 你应该澄清它是一个最后带有测试的循环。 VB6/VBA 有一个“Do While ... Loop”语法,在循环开始时进行测试。

标签: language-agnostic loops


【解决方案1】:

当您需要做某事至少一次,但不知道启动循环之前的次数时。

【讨论】:

  • 我自己说得再简单不过了。 +1
  • 但有时你不需要 do...while 来执行此操作,例如 while(input.hasNext()) 之类的东西,因此这不一定是硬性规则.
  • @Thomas Owens:嗯,你可以用一个简单的 for 语句来完成你需要的每一种循环,所以你不需要 do/while 本身,但我会说,如果你想表达意图这是 do/while 非常适合的情况。
  • “启动循环”是指:1. 初始化变量OUTSIDE do ... while 语句,还是2. 初始化do... while 语句主体内的变量?跨度>
【解决方案2】:

通常它不是最好的使用方法,但一种情况是您必须至少执行一次某事,但任何进一步的迭代都取决于某些条件。

do {
    //do something
} while ( condition );

【讨论】:

    【解决方案3】:

    还没有人提到它在 C 宏中的用途...

    #define do_all(x) do{ foo(x); bar(x); baz(x); } while(0)
    

    然后在代码中你可以拥有

    do_all(a);
    
    • 关键是它只执行一次,宏调用末尾的分号完成了 while(0);声明。

    【讨论】:

      【解决方案4】:

      如果我需要实现大量条件检查,例如在 php 中处理输入表单,我之前使用过它。可能不是最佳实践,但它比许多替代方案更具可读性:

      do {
         if ( field1_is_invalid ) {
            $err_msg = "field1 is invalid"; break;
         }
      
         if ( field2_is_invalid ) {
            $err_msg = "field2 is invalid"; break;
         }
      
         .. check half a dozen more things ..
      
         // Only executes if all checks succeed.
         do_some_updates();
      
      } while (false)
      

      另外,我想这在技术上不是一个循环。更像是一种避免使用 GOTO 的方法 :)

      【讨论】:

      • 难道不只是将相同的逻辑包装在一个函数中并用返回替换中断更具可读性吗?您也可以在返回值中指出哪张支票出错了。
      • @shylent - 是的,这就是为什么我提到它可能不是最佳实践。但它有时会派上用场。
      【解决方案5】:

      当某些事情需要发生时,我通常会使用 do-while,但它不一定会在第一次“正确”发生。例如:

      int x;
      do
      {
          x = random.next(100);
          cout << x << endl;
      } while (x != 13);
      

      在这种情况下,您开始的 x 根本不重要,因为它已被覆盖。

      【讨论】:

        【解决方案6】:

        当您希望在循环执行结束时检查您的条件时,这是合适的。因此,循环将始终至少运行一次,然后它会验证它是否应该进一步迭代。

        【讨论】:

          【解决方案7】:

          当做某事然后评估布尔表达式更合适时...或如 Brian 所说...当您需要至少完成一次某事时。此语法将布尔表达式的计算移到循环之后而不是循环之前。

          【讨论】:

            【解决方案8】:

            只要循环中的内容至少需要执行一次。

            【讨论】:

              【解决方案9】:

              我一直认为 do-while 在基于 C 的语言中没有应该尽可能多地使用,因为“while”关键字的重用既尴尬又令人困惑。 Pascal 的 repeat-until 与其 while-begin-end 结构不共享任何关键字。

              我很想有朝一日分析一大堆代码,看看与其他语言中的类似结构相比,C 代码中 do-while 的代表性是否不足。

              【讨论】:

                【解决方案10】:

                do while() 在条件为 true 时循环,但另一方面,Pascal 的 repeat until 在条件为 false 时循环(两者都将至少运行一次)。

                当我在 Pascal 中编程时,我几乎总是使用 repeat until
                当我用 C++ 编程时,我几乎总是使用 while() {}

                我无法解释为什么,但我觉得这是正常。奇怪吗?

                【讨论】:

                  【解决方案11】:

                  当从文件读取或等待建立连接(其他人机交互也是如此)时,任何事先未知的迭代次数(例如 sql 查询返回的记录数),或当当遍历对象的所有组合/排列时,每当“for”循环条件变得繁琐时,您都会执行不同大小的步骤(例如,从文件中读取 1 或 5 行,具体取决于最后一次读取)

                  【讨论】:

                    【解决方案12】:

                    当您执行递归操作时的另一个异常,例如读取内部异常:

                    catch(Exception exc)
                    {
                        Exception currentException = exc;
                        do
                        {
                            Console.WriteLine(string.Format("{0}: {1}", currentException.GetType().Name, currentException.Message));
                        } while((currentException = currentException.InnerException) != null);
                    }
                    

                    【讨论】:

                      【解决方案13】:

                      通常当你需要用户输入一些值时,计数器变量是基于输入值的,你使用do-while。 //下面的代码是C++。它要求用户输入一个数字并重复,直到用户输入大于0的数字。

                      do{
                          cout << "Enter a Positive integer: ";
                          cin >> num;
                      }while( num < 0 );
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-09-13
                        • 2011-11-19
                        • 2010-10-08
                        • 2012-06-22
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多