どちらがいいですか? {} while(0);またはgoto xy; [閉まっている
-
09-10-2019 - |
質問
2つのコードがあります:
while loop:
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-IFを使用するのが好きではありません。なぜなら、それは再びもう1つの条件をチェックするオーバーヘッドです。そのため、問題がある場合は直接終了します。
この編集の後、私の質問は理にかなっていると思います
前もって感謝します
解決
ここでの選択は、あなたの質問に基づいて、 do-while
と goto
.
選択することをお勧めします do-while
.
使用することを思いとどまらせます goto
. 。それはあなたを後でスパゲッティコードに導きます。
あなたはような代替品を持つことができます if
と if-else
同じ結果を考え出すため。
ノーと言ってください goto
他のヒント
オプション3:
void frobnicate(arguments)
{
if (cond1) return;
if (cond2) return;
...
}
frobnicate(the_arguments)
意味のある名前を選び、短くしてください。
彼らは同じコードを生成します(コンパイラの価値を考慮すると仮定します)したがって、違いは最も理解しやすいものであり、do/が他のループ構造を妨げるかどうかです。そのような干渉がある場合は、gotosを使用してください。それ以外の場合はしないでください。それらはあまり明確ではありません(通常)。
また、関数が過度に複雑であり、より明確な目的とより単純な制御フローを備えた複数の機能にリファクタリングする必要があるかどうかを注意深く確認してください。
真剣に?聞いたことがありませんか else
?
if (cond1)
{
//stuff
}
else if (cond2)
{
// more stuff
}
// etc
else
{
// default
}
編集
質問を誤解しました。コメントは他の人の意味を理解していないので、私はここに古い答えを残すつもりです。
質問に基づいて正確にコーディングする適切な方法は、次のとおりです。
if (!cond1)
{
.
.
.
.
}
どちらの場合も、質問の if (cond2)
パーツには効果がありません(cond2には副作用がないと仮定します)。どちらもとにかく実行される声明にジャンプします。だから私はそれを残しました。
goto
悪です。使用するだけです goto
sこれを行う他の方法が絶対にないとき。 goto
Sは、予測不可能なスパゲッティコードにつながる可能性があります(読みにくい、理解する、デバッグし、メンテナンスフェーズに間違いを犯しやすい)。
条件付きのループ中は無限であると信じています break
声明はまだ優れていますが、条件が表現されると読みやすいです while
声明。