while循环中的条件为0时,do while循环的意义是什么,即始终为false。
do
{
//some code implementation.
}while(0);
我在很多地方都看到过这种情况。它的重要性是什么,我们只是省略do while(0)。因为两种方式代码只会被执行一次。
这不是重复,因为我询问使用while(0)条件,特别是一般的do-while循环。
答案 0 :(得分: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();
}
在某些情况下,我会说这是可以接受的,特别是如果需要制作一系列被视为原子的操作。就像上面的例子一样。
答案 1 :(得分:2)
它确保宏始终表现相同,无论在调用代码中如何使用分号和花括号。
有关详细信息,请参阅this
答案 2 :(得分:0)
该上下文中的do { } while(0)
构造是一种混淆的方式来编写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();
}
可以看出,它更短,更明显。你甚至不得不问这个结构的目的,这表明它是一个坏主意。
我的回答非常激烈,因为我有一位同事在我们的项目中使用和滥用它,我没有找到1个重新命名的值。当你在混音中添加一些真正的循环时,它会变得更加烦人。然后,乐趣开始找到break
和continue
将引导您前往的位置。
编辑: 这里链接到Linus Torvald关于goto主题的咆哮。 http://kerneltrap.org/node/553/2131