在查看由其他员工处理的一些代码时,我看到了很多编写的代码:
do{
...
}while(false);
这提供了什么优势(如果有的话)?
以下是代码中发生的更多骨架:
try{
do{
// Set some variables
for(...) {
if(...) break;
// Do some more stuff
if(...) break;
// Do some more stuff
}
}while(false);
}catch(Exception e) {
// Exception handling
}
更新
C ++版本:
Are do-while-false loops common?
答案 0 :(得分:22)
也许这样做是为了能够随时跳出“循环”,例如:
do
{
...
if (somethingIsWrong) break;
//more code
...
}
while(false);
但正如其他人所说,我不会这样做。
答案 1 :(得分:17)
在Java中,没有理由这样做。
在C中,这是定义宏时常用的习惯用法:
考虑:
#define macro1 doStuff(); doOtherStuff()
#define macro2 do{ doStuff(); doOtherStuff(); } while( false )
if( something ) macro1; // only the first statement in macro1 is executed conditionally
if( something ) macro2; // does what it looks like it does
...但是C中的宏是邪恶的,如果可能的话应该避免使用。
您的同事是否来自C背景?
答案 2 :(得分:14)
没有优势。不要这样做。
答案 3 :(得分:5)
它可以用于转到块的末尾,可以用来避免嵌套if / then块。
do {
if (done()) continue;
// do a bunch of stuff
if (done()) continue;
// do a bunch more stuff
if (done()) continue;
// do even more stuff
} while (false);
答案 4 :(得分:4)
这在C中用于定义宏内部的块。例如,请参阅this。
示例,以下内容无效:
#define f(x) { g(x); h(x); }
if (x >= 0) f(x); else f(-x);
但是通过这个定义,它将起作用:
#define f(x) do { g(x); h(x) } while(false)
答案 5 :(得分:3)
它没用,但是编码器可以使用多个break命令来做一些奇怪的异常处理。
do{
if(<something>){...}else{break}
if(<something else>){...}else{break}
...
}while(false)
认定它的愚蠢,但我确实找到了类似旧c程序的东西
答案 6 :(得分:2)
你的直觉是正确的。这是一件完全无用的事情。
可能无论是谁编码它最初都有false
之外的其他内容作为条件,只需将其更改为false
而不是删除整个块而不是丢失这段代码的“历史”。然而,这只是抓住稻草。坦率地说,它只是tautology的一个简单例子,它在代码中没有位置。
答案 7 :(得分:1)
除了C / C ++之外,几乎所有语言都没有提供战术优势。
在C / C ++中有一种宏的情况,其中do / while(false)可以更容易地将宏安全地扩展到多个语句中。当宏看起来像普通函数调用时,这是有利的。
答案 8 :(得分:1)
看看这个question
OP询问这个确切的结构并解释了使用它的一些原因。共识似乎是做坏事。
答案 9 :(得分:1)
作为未来的占位符,其他条件代替false
。
答案 10 :(得分:1)
它可以用来跳过某些代码的执行(比如goto
或者某些东西)但是当我再次查看它时,似乎有一个for
循环(其中if(...) break;
} {statements})在do-while
中。否则,我会说它将是goto
...
答案 11 :(得分:1)
我多年来一直使用这个惯例!当你有一个处理和/或条件检查的“管道”时,它是最有用的。它简单地避免了多层嵌套的if()语句,从而使代码(更多)更容易阅读。是的,有像try / catch这样的替代品,我只在某些薄/低级别的情况下使用这种风格。
我用像......这样的评论开始“循环”(从未实际循环)。
// Error loop (never loops)
错误循环是......
set errorCode = fail;
do {
if (this)
break;
if (that)
break;
// Success
set errorCode = ok;
// Alternative Success
errorCode = doWhatever();
} while (false);
如果你有一堆嵌套的if()语句并且你的缩进深度超过3级,请考虑这种风格。
我在Perl,C / C ++,Java和Delphi / Pascal中使用过这个约定。
答案 12 :(得分:0)
我猜这个作者不相信他的代码所以他曾经运行过几次,看看是否能让它更有用,这就是考古遗存。
答案 13 :(得分:0)
我能想到的唯一原因是创建一个块来使{...}
中声明的变量更加严格,但是有更好的方法可以做到这一点(比如创建函数,或者只是创建块) - 帽子提示来到Pete Kirkham)。