当while循环内的条件为0即始终为假时,执行while循环有什么意义。
do
{
//some code implementation.
}while(0);
我在很多地方都看到了这个正在使用。它的重要性是什么,我们不能省略 do while(0)。因为两种方式的代码都只会执行一次。
它不是重复的,因为我询问了使用 while(0) 条件,特别是不是一般的 do-while 循环。
它可以用来在任何时候离开一定范围的代码而不离开函数。考虑:
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();
}
在某些情况下,我会说这是可以接受的,特别是如果需要进行一系列被视为原子的操作时。就像上面的例子一样。
它确保宏始终表现相同,无论在调用代码中如何使用分号和大括号。
有关更多详细信息,请参阅此
在这种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