web-dev-qa-db-ja.com

if-elseではなくswitchステートメントが必要な理由

私は今しばらくの間これを疑問に思っていました。私はハードコアプログラマーではありません。主に小さいPythonスクリプトで、いくつかの分子動力学シミュレーションを作成しました。本当の質問:何のポイントですか switchステートメント?なぜあなただ​​けを使用できないのですか if-elseステートメント

ご回答いただきありがとうございます。これが以前に質問された場合は、リンクを指定してください。

[〜#〜] edit [〜#〜]

S.Lott は、これが質問の重複である可能性があることを指摘しました If/Else vs. Switch 。閉じたい場合は閉じてください。さらなる議論のために、それを開いたままにします。

59
Nope

switch構成は、より簡単に ジャンプ(またはブランチ)テーブル に変換されます。これにより、caseラベルが互いに近い場合、switchステートメントをif-elseよりもはるかに効率的にすることができます。アイデアは、一連のジャンプ命令をメモリに連続して配置し、その値をプログラムカウンタに追加することです。これにより、一連の比較命令が追加操作に置き換えられます。

以下は、非常に単純化された疑似アセンブリの例です。まず、if-elseバージョン:

    // C version
    if (1 == value)
        function1();
    else if (2 == value)
        function2();
    else if (3 == value)
        function3();

    // Assembly version
    compare value, 1
    jump if zero label1
    compare value, 2
    jump if zero label2
    compare value, 3
    jump if zero label3
label1:
    call function1
label2:
    call function2
label3:
    call function3

次はスイッチバージョンです。

    // C version
    switch (value) {
    case 1: function1(); break;
    case 2: function2(); break;
    case 3: function3(); break;
    }

    // Assembly version
    add program_counter, value
    call function1
    call function2
    call function3

結果のアセンブリコードがはるかにコンパクトであることがわかります。値は、1、2、3以外の値を処理するために何らかの方法で変換する必要があることに注意してください。ただし、これは概念を説明する必要があります。

87
Judge Maygarden

Switchは compileで最適化 rにできます-コードが高速になります。
また、列挙可能な型を扱う場合、よりエレガントであることがわかります。

switchステートメントを要約すると、performance+code eleganceが得られます:)

便利なリンクを次に示します。

22
aku

表現力を高めるために、switch/caseステートメントを使用すると、複数のケースをグループ化できます。次に例を示します。

case 1,2,3: do(this); break;
case 4,5,6: do(that); break;

パフォーマンスのために、コンパイラーはswitchステートメントをジャンプテーブルに最適化できる場合があります。

6
jdigital

このタイプの低レベルの最適化は、通常は重要ではなく、おそらくコンパイラーごとに異なるため、無視しています。

主な違いは読みやすさだと思います。 if/elseは非常に柔軟ですが、スイッチを見ると、すべてのテストが同じ式に対するものであることがすぐにわかります。

6
Darron

.NETで言及されている他のコードの読みやすさと最適化に加えて、列挙型などをオンにする機能も利用できます。

enum Color { Red, Green, Blue }; 

Color c = Color.Red;

switch (c) // Switch on the enum

{

// no casting and no need to understand what int value it is

case Color.Red:    break;
case Color.Green:  break;
case Color.Blue:   break;

}
3
Justin King

いくつかのケース(意図的にbreakステートメントを省略する)を通過する機能は便利な場合があります。また、一部の人はすでにそれが速いと言っています。ただし、おそらく最も重要で最も重要でない考慮事項は、if/elseよりもきれいなコードを作成することです。 :)

2

スイッチは、一部のコンパイラによって「より良い」最適化が可能です。特定の言語でswitchステートメントを使用すると、落とし穴があります。 Javaでは、スイッチは文字列を処理できず、VB2005では、switchステートメントはラジオボタンでは機能しません。
スイッチはより高速で読みやすく、If-Thenはより汎用的で、より多くの場所で動作します。

1
WolfmanDragon