コンテンツにスキップ

switch文

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。182.171.209.181 (会話) による 2010年10月22日 (金) 23:35個人設定で未設定ならUTC)時点の版であり、現在の版とは大きく異なる場合があります。

switch文(スイッチぶん)とは、プログラミング言語において条件の値に対応する文を実行するための条件文の一種である。

文法

Cおよびそれに類する言語の場合

基本的な構文は以下の通りになる。

switch (条件式) {
   case  : 

   ………

   default : 
}

上記の「case」はいくつでも記述することができる。

この条件文は次のような手順で実行される。

  1. 条件の値を評価する。
  2. もし、条件式の値がcaseで指定された値であるなら、その文を実行する。
  3. 条件式の値がcaseで指定されていなければ、defaultで指定されている文を実行する。
  4. もしdefaultが記述されていなければ、何も実行せずにswitch文を抜ける。

ここで注意しなければならないのが、caseで実行された後、switch文を抜けずにそれ以降の文も実行される点である(caseはラベルに過ぎないので、次のcaseの前でswitch文を抜けさせる働きはない)。一般的には、次のcaseの分岐へまたがる直前でbreak文を記述する。このルールはフォールスルー(fall through)と言い、複数の値について同じ動作をさせたい場合に便利であるが、一方でbreak文を書き忘れやすいためしばしばバグの温床として問題視されてきた。そのためlintでは、意図的にフォールスルーしていることを示す/* FALLTHROUGH */などのコメントが記述されていない限り警告を出す。また、Cに類するシンタックスを持つ言語でも、C#など次のcaseに落ちない言語も登場している。

上記の例は、if文を羅列することで同様の動作を実現することができる。

if (条件式 == ) {
   
} else if (条件式 == ) {
   
}

………

else {
   
}

switch文においてdefaultは最後に記述される場合が多いが、必ずしも最後である必要はない。また、caseによる分岐は以下のようにdo-while文と組み合わせることも可能である。

switch(count)
{
   default:       do {    printf("%d\n", a); a++;
   case 0:                printf("%d\n", a); a++;
   case 1:                printf("%d\n", a); a++;
   case 2:                printf("%d\n", a); a++;
                  } while (a);
}

例えばDuff's deviceではそのような使われ方をしている。

C#

C#ではCの構文に加えて「goto case」文が使える

switch (someInteger)
{
 case 0:
 case 1:
  return 1; // 変数someIntegerが0か1の時に実行

 case 2:
  someInteger++;
  goto case 3: // case 3も実行

 case 3:
  A;
  break;

 default:
  B;
  break;
}

C#では、1つ以上のステートメントが書かれたcaseラベルから次のcaseラベルにフォールスルーすることは許されない。ただし、ステートメントのないcaseラベルにおいてはこの限りではない。

C#では、CやC++が整数型しか条件の値に使用できないのに対し、文字列型にもswitch文を適用することができる。

PHP

PHPでは、C#と同様、文字列にも、switch文が適用できる。

switch (str) {
    case "ABC":
        文A;
        break;
    case "XYZ":
        文B;
        break;
    case "123":
        文C;
        break;
    default:
        文D;
        break;
}

BASIC

構造化されたBASICでは、Select Caseステートメントが存在することが多い。このステートメントでは、文字列または整数を対象にできる。

Select Case str
    Case "ABC"
        A
    Case "XYZ"
        B
    Case "123"
        C
    Case Else
        D
End Select
Select Case age
    Case Is < 20
        A
    Case 20 To 29
        B
    Case 30,50,70
        C
    Case Else
        D
End Select

Cなどと違い、各Caseはラベルではなく、Selectステートメントはフォールスルーでない。

Perl

Perlでは、perl-5.8以降からuse Switchとした上でswitch case文が使えるようになった。それ以前のバージョンのperlに関しては、Perl付属文章perlsynドキュメントのBasic BLOCKs and Switch Statementsの節に書式の例が書かれている。

関連項目