4

私は2つのコードを持っています:

do whileループ:

do
{
    errorflag=0;
    ...
    if(cond1)
    {
        errorFlag=12;
        break;   // Error Conditions
    }
    .
    .            // Processing
    .
    if(cond2)  
    {
        errorflag=56;
        break;
    }
     .
     .

} while (0);

gotoラベル:

errorflag=0;
if(cond1)
{
     errorflag=12;
     goto xy;
 .
 .
 .
 .
if(Cond2)
{
     errorflag=56;
     goto xy;
}
.
.
.

xy:

どちらがいいですか?なぜ詳細を教えてください。またはこれを行うためのより良い方法はありますか?コードを最適化しています。私たちは、この種の大きなループを最も調査しています。アセンブリレベルであり、最適化の余地はそれほどありません。入力を入力してください。

私はelseを使いたくありません-それ以来、それはもう1つの条件をチェックするオーバーヘッドです。したがって、問題が発生した場合は直接終了してください。

この編集の後、私の質問は理にかなっていると思います

前もって感謝します

4

5 に答える 5

13

オプション3:

void frobnicate(arguments) 
{
  if (cond1) return;
  if (cond2) return; 

  ...
}

frobnicate(the_arguments)

意味のある名前を選び、短くしてください。

于 2010-12-13T10:21:23.173 に答える
5

それらは同じコードを生成するので(コンパイラーの考慮に値すると仮定して)、違いは最も理解しやすいものの1つであり、do/whileが他のループ構造に干渉するかどうかです。このような干渉がある場合は、gotosを使用してください。それ以外の場合はしないでください。それらはあまり明確ではありません(通常)。

また、関数が複雑すぎて、目的が明確で制御フローが単純な複数の関数にリファクタリングする必要があるかどうかを注意深く確認してください。

于 2010-12-13T10:22:38.060 に答える
3

真剣に?聞いたことがありませんelseか?

if (cond1)
{
    //stuff
}
else if (cond2)
{
    // more stuff
}
// etc

else
{
    // default
}

編集

質問を読み間違えました。コメントは他の意味では意味がないので、ここに古い答えを残しておきます。

問題の内容に従って正確にコーディングする適切な方法は次のとおりです。

if (!cond1)
{
    .
    .
    .
    .
}

どちらの場合も、どちらもif (cond2)次に実行されるステートメントにジャンプするため、パーツには効果がありません(cond2に副作用がないと仮定)。だから私はそれを省きました。

于 2010-12-13T10:32:41.980 に答える
-3

goto悪です。gotoこれを行う方法が他に絶対にない場合にのみ、sを使用する必要があります。gotosは、予測できないスパゲッティコードにつながる可能性があります(読みにくく、理解しにくく、デバッグしにくく、メンテナンスフェーズで間違いを起こしやすい)。

break条件がステートメントで表現されていると読みやすくなりますが、条件付きステートメントを使用した無限のwhileループの方が優れていると思いますwhile

于 2010-12-13T10:20:52.760 に答える
-9

ここでの選択は、あなたの質問に基づいて、do-whilegotoです。

を選択することをお勧めしますdo-while

を使用しないことをお勧めしますgoto。それは後でスパゲッティコードにあなたを導きます。

のような代替案ifif-else用意して、同じ結果を出すことができます。

ノーと言うgoto

于 2010-12-13T11:27:24.050 に答える