[解決済み] if-else文に対するswitchの優位性
2022-04-22 20:45:55
質問
を使用する際のベストプラクティスは何ですか?
switch
ステートメントを使用するのと
if
ステートメントを 30
unsigned
の列挙のうち、10個程度は期待されるアクション(現在のところ同じアクション)を持っている。パフォーマンスとスペースは考慮する必要がありますが、重要ではありません。 このスニペットは抽象化されているので、命名規則で私を嫌いにならないでください。
switch
ステートメントを使用します。
// numError is an error enumeration type, with 0 being the non-error case
// fire_special_event() is a stub method for the shared processing
switch (numError)
{
case ERROR_01 : // intentional fall-through
case ERROR_07 : // intentional fall-through
case ERROR_0A : // intentional fall-through
case ERROR_10 : // intentional fall-through
case ERROR_15 : // intentional fall-through
case ERROR_16 : // intentional fall-through
case ERROR_20 :
{
fire_special_event();
}
break;
default:
{
// error codes that require no additional action
}
break;
}
if
ステートメントを使用します。
if ((ERROR_01 == numError) ||
(ERROR_07 == numError) ||
(ERROR_0A == numError) ||
(ERROR_10 == numError) ||
(ERROR_15 == numError) ||
(ERROR_16 == numError) ||
(ERROR_20 == numError))
{
fire_special_event();
}
解決方法は?
スイッチを使用します。
最悪の場合、コンパイラはif-elseチェーンと同じコードを生成するので、何も失うことはありません。もし迷ったら、最も一般的なケースを最初にswitch文に入れましょう。
最良の場合、オプティマイザはコードを生成するためのより良い方法を見つけるかもしれません。コンパイラがよくやるのは、二項決定木(平均的なケースでは比較とジャンプを節約する)か、単純にジャンプテーブル(比較をまったくせずに動作する)を構築することです。
関連
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] JavaScriptで複数ケースを扱うSwitch文
-
[解決済み] AngularJS テンプレートにおける if else ステートメント
-
[解決済み] switch文の複数ケース
-
[解決済み] C#のSwitch文のフォールスルー?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】「switch」は「if」よりも速い?