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 に答える
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

あなたの直感は正しいです。それはまったく無駄なことです。

最初にそれをコード化した人は誰でも条件として以外の何かを持っていて、コードのこの「履歴」を失わないようにブロック全体を削除するのではなく、単純に変更した可能性があります。ただし、これはストローをつかんでいるだけです。率直に言って、これはトートロジーの単純な例に過ぎず、コードには存在しません。falsefalse

于 2009-09-18T14:49:42.520 に答える
1

の代わりに他の条件が設定された場合の将来のプレースホルダーとしてfalse

于 2009-09-18T15:03:03.843 に答える
1

一部のコード(または何かなど)の実行をスキップするために使用できますがgoto、もう一度見てみると、にforループ(if(...) break;ステートメントがある場所)があるようdo-whileです。そうでなければ、私はそれがJavaバージョンのgoto...

于 2010-03-30T16:39:17.797 に答える
1

C/C++ 以外のほとんどすべての言語では、これは戦術的な利点を提供しません。

C/C++ では、do/while(false) を使用すると、マクロを複数のステートメントに安全に展開することが容易になる場合があります。これは、マクロが通常の関数呼び出しのように見える場合に有利です。

于 2009-09-18T14:52:23.567 に答える
1

この質問を見てください

OP は、この正確な構成について質問し、それを使用するいくつかの理由を説明します。コンセンサスは、それは悪いことだということのようです。

于 2009-09-18T14:54:04.480 に答える
0

その作者は自分のコードを信頼していなかったので、それを数回実行して、それがより機能するかどうかを確認していたと推測します。これはその考古学的遺跡です。

于 2009-09-18T14:50:11.007 に答える
0

私が考えることができる唯一の理由は、より厳密にスコープ内で宣言された変数を作成するブロックを作成することですが{...}、これを行うより良い方法があります (関数を作成する、または単にブロックを作成するなど - Pete Kirkham へのヒント)。

于 2009-09-18T14:50:18.393 に答える