do-while(false)的优点是什么?

时间:2009-09-18 14:47:25

标签: java loops while-loop

在查看由其他员工处理的一些代码时,我看到了很多编写的代码:

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?

14 个答案:

答案 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 ...

的Java版本

答案 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)。