-2

重複の可能性:
if-elseステートメントに対するswitchの利点
なぜif-elseではなくswitchステートメントなのか?

switchステートメントはまったく役に立たないようです。それができることはすべて、ifおよびelseifリンクによって実行できます。

それらはおそらく同じコードにコンパイルすることさえあります。

では、なぜわざわざそれを持っているのですか?

breakswitchのステートメントは私を夢中にさせ、そのlabel:形式はgotoを思い出させます。

これはobjective-c、c、C++用です。vb.netにswitchステートメントがあるかどうかはわかりませんが、あるとしても、使用したことがないので忘れてしまったに違いありません。

4

4 に答える 4

10

それらは同じコードにコンパイルされる可能性があります。しかし、その意図は、より良いソースコードを提供することであるほど、必ずしもより良いコンパイル済みコードを提供することではありません。

とループすることwhileもできますが、それは役に立たないわけではありません。どちらかと言えば:forifgotowhilefor

for (i = 0; i < 10; i++)
    doSomethingWith (i);

また:

    i = 0;
loop12:
    if (! (i < 10))
        goto skip12
    doSomethingWith (i);
    i++;
    goto loop12
skip12:
于 2013-01-02T06:37:48.250 に答える
3
if (color == WHITE)
{
}
else if (color == BLACK)
{
}
else if (color == GREY)
{
}
else if ((color == ORANGE) || (color == GREEN) || (color == BLUE))
{
}
else
{
}

vs

switch(color)
{
   case WHITE:
       break;
   case BLACK:
       break;
   case GREY:
       break;
   case ORANGE:
   case GREEN:
   case BLUE:
       break;
   default:
       break;
}

後者の方が読みやすく、必要なキーストロークも少なくて済みませんか?


読みやすさの他に、スイッチケースの別のユニークな使用法があります:Duff'sDevice。この手法は、との結合のgoto-nessを利用します。switch-casewhile

void dsend(char* to, char* from, count) {
  int n = (count + 7) / 8;
  switch (count % 8) {
  case 0: do {
      *to = *from++;
      case 7: *to = *from++;
      case 6: *to = *from++;
      case 5: *to = *from++;
      case 4: *to = *from++;
      case 3: *to = *from++;
      case 2: *to = *from++;
      case 1: *to = *from++;
    } while (--n > 0);
  }
}
于 2013-01-02T06:41:02.947 に答える
1

スイッチのパフォーマンスは、最悪の場合にブロックされた場合と同じです。それは良いかもしれません。これについては前に説明しました:if-elseステートメントを切り替える利点

于 2013-01-02T06:39:49.907 に答える
0

長所:

Switchプログラムを書くより良い方法を提供しますif

Switchif実行中にコンパイラがジャンプテーブルを生成して、どちらのケースが満たされているかをチェックするのではなく、どちらのケースが満たされているかを判断するためよりも高速に動作します。

短所:

caseintまたはchar定数またはこれらのいずれかに評価される式のみを持つことができます!

于 2013-01-02T06:41:18.643 に答える