switch文
switch文(スイッチぶん)とは、プログラミング言語において条件の値に対応する文を実行するための条件文の一種である。
文法
Cおよびそれに類する言語の場合
基本的な構文は以下の通りになる。
switch (条件式) {
case 値 : 文
………
default : 文
}
上記の「case」はいくつでも記述することができる。
この条件文は次のような手順で実行される。
- 条件の値を評価する。
- もし、条件式の値がcaseで指定された値であるなら、その文を実行する。
- 条件式の値がcaseで指定されていなければ、defaultで指定されている文を実行する。
- もし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の節に書式の例が書かれている。