什么时候适当?

时间:2009-06-23 21:05:52

标签: language-agnostic loops

什么时候比其他类型的循环更好?有哪些常见情况比其他情况更好?

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

13 个答案:

答案 0 :(得分:54)

如果您需要至少完成一次,但不知道启动循环之前的次数。

答案 1 :(得分:3)

这通常不是最好用的,但有一种情况是你必须至少做一次事情,但任何进一步的迭代都取决于某些条件。

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

答案 2 :(得分:3)

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

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

然后在你可以拥有的代码中

do_all(a);
  • 关键是它只执行一次,宏调用结束时的分号完成while(0);言。

答案 3 :(得分:2)

如果我需要实现大量的条件检查,我之前已经使用过它,例如在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的方法:)

答案 4 :(得分:2)

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

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

在这种情况下,你开始使用的x根本不重要,因为它被覆盖了。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

每当循环中的内容需要至少执行一次时。

答案 9 :(得分:0)

我一直认为,do-while不会在基于C语言的语言中使用,因为应该,因为重复使用“while”关键字是尴尬和令人困惑的。 Pascal的repeat-until不会与while-begin-end结构共享任何关键字。

我希望有一天能够分析一大堆代码,看看与其他语言中的类似结构相比,C代码中的代表性是否有所不足。

答案 10 :(得分:0)

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

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

我无法解释原因,但我觉得它正常。奇怪?

答案 11 :(得分:0)

从文件读取或等待建立连接(其他人工交互)时,任何事先知道迭代次数的事情(例如,sql查询返回的记录数),或者何时你做了不同大小的步骤(例如,从文件读取1或5行,取决于最后一次读取),当遍历对象的所有组合/排列时,每当“for”循环条件变得麻烦时

答案 12 :(得分:0)

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

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