22

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

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++ 版本:
do-while-false 循环是否常见?

4

14 回答 14

27

也许这样做是为了能够随时跳出“循环”,例如:

do
{
    ...
    if (somethingIsWrong) break;
    //more code
    ...
}
while(false);

但正如其他人所说,我不会这样做。

于 2009-09-18T14:52:40.790 回答
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 背景?

于 2009-09-18T14:54:37.193 回答
14

没有优势。不要这样做。

于 2009-09-18T14:49:12.210 回答
6

它可用于转到块的末尾,可用于避免一堆嵌套的 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);
于 2013-07-17T20:02:44.797 回答
4

这在 C 中用于定义宏内部的块。参见这个例子。

例如,以下内容无效:

#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)
于 2009-09-18T14:53:19.650 回答
3

它没用,但是编码器可以使用多个中断命令来进行一些奇怪的异常处理。

do{
if(<something>){...}else{break}
if(<something else>){...}else{break}
...
}while(false)

承认它很愚蠢,但我确实曾经在旧的 c 程序中找到过类似的东西

于 2009-09-18T14:55:08.603 回答
2

你的直觉是对的。那是完全没用的事情。

可能编码它的人最初有其他东西而不是false条件,并且只是将其更改为false而不是删除整个块,以免丢失代码的这个“历史”。然而,这只是抓住稻草。坦率地说,这只是一个重言式的简单示例,在代码中没有位置。

于 2009-09-18T14:49:42.520 回答
1

在除 C/C++ 之外的几乎所有语言中,这都没有提供任何战术优势。

在 C/C++ 中,有一种宏的情况,其中 do/while(false) 可以更轻松地将宏安全地扩展为多个语句。当宏看起来像一个普通的函数调用时,这是有利的。

于 2009-09-18T14:52:23.567 回答
1

看看这个问题

OP 询问了这个确切的结构并解释了使用它的一些原因。共识似乎是这样做是一件坏事。

于 2009-09-18T14:54:04.480 回答
1

当其他条件代替 . 时,作为未来的占位符false

于 2009-09-18T15:03:03.843 回答
1

它可以用来跳过某些代码的执行(比如 a或goto其他东西),但是当我再次查看它时,在. 否则,我会说这将是一个 Java 版本的...forif(...) break;do-whilegoto

于 2010-03-30T16:39:17.797 回答
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 中使用过这个约定。

于 2016-06-02T19:38:55.903 回答
0

我猜那的作者不相信他的代码,所以他曾经运行它几次,看看是否让它更有效,这就是考古遗迹。

于 2009-09-18T14:50:11.007 回答
0

我能想到的唯一原因是创建一个块来使变量在{...}更紧密的范围内声明,但是有更好的方法来做到这一点(比如创建函数,或者只是创建块 - 向 Pete Kirkham 致敬)。

于 2009-09-18T14:50:18.393 回答