3

当while循环内的条件为0即始终为假时,执行while循环有什么意义。

do
{

//some code implementation.

}while(0);

我在很多地方都看到了这个正在使用。它的重要性是什么,我们不能省略 do while(0)。因为两种方式的代码都只会执行一次。

它不是重复的,因为我询问了使用 while(0) 条件,特别是不是一般的 do-while 循环。

4

3 回答 3

2

它可以用来在任何时候离开一定范围的代码而不离开函数。考虑:

do
{
  beginAtomicOperationSequence();

  ret = doSomething();
  if (ret < 0) break;

  ret = doSomething2();
  if (ret < 0) break;

} while(0);

if (ret < 0) {
  switch (ret) {
   //handle error
  }
  rollbackAboveOperations();
} else {
  commitAboveOperations();
}

在某些情况下,我会说这是可以接受的,特别是如果需要进行一系列被视为原子的操作时。就像上面的例子一样。

于 2013-05-06T11:41:12.517 回答
2

它确保宏始终表现相同,无论在调用代码中如何使用分号和大括号。

有关更多详细信息,请参阅

于 2013-05-06T12:02:26.920 回答
0

在这种do { } while(0)情况下,构造是一种在不实际写出 goto 的情况下编写 goto 的混淆方式。它被货物狂热的程序员使用,他们在某处读到 goto 不好但不明白为什么。

在这里,Dariusz 的答案示例用适当goto且有意义的标签重写。

  beginAtomicOperationSequence();

  ret = doSomething();
  if (ret < 0) goto handle_error;

  ret = doSomething2();
  if (ret < 0) goto handle_error;

  ...

handle_error:
  if (ret < 0) {
    switch (ret) {
    //handle error
    }
    rollbackAboveOperations();
  } else {
    commitAboveOperations();
  }

可以看出它更短且完全明显。您甚至不得不询问该构造的目的,这表明这是一个坏主意

我的回答很激烈,因为我有一位同事在我们的项目中使用和滥用它,我还没有发现它的价值。当您在混音中添加一些真正的循环时,它会变得更加烦人。然后,乐趣开始找到break并将continue带您去的地方。

编辑:这里链接到 Linus Torvald 关于 goto 主题的咆哮。 http://kerneltrap.org/node/553/2131

于 2013-05-06T12:20:06.787 回答