switch
とcase
switch
は、式の値を複数の値と比較する文だ。これは、"if、else if、else"の連鎖と似ているが、同じではない。case
は、switch
の式と比較する値を指定するために使う。case
は、switch
文の一部であり、文そのものではない。
switch
は、括弧で囲まれた式を取り、その式の値をcase
の値と比較し、式の値と等しいcase
の操作を実行する。その構文は、1つ以上のcase
セクションと default
セクションを含むswitch
ブロックで構成される。
switch
が取る式は、論理式として直接使用されるわけではない。if
文のように"この条件が真の場合"として評価されるわけではない。switch
式の値は、case
値との等価比較に使用される。これは、等価比較のみを行う"if、else if、else"の連鎖に似ている。
ただし、上記の"if、else if、else"は、switch
文とまったく同じではない。その理由は、次のセクションで説明する。
case
の値がswitch
式の値と一致する場合、case
の下にある操作が実行される。一致する値がない場合、default
の下にある操作が実行される。
goto
文
goto
の使用は、ほとんどのプログラミング言語では一般的に推奨されてない。ただし、goto
は、他の用途ほど問題にならない、switch
文では、状況によっては有用だ。goto
文については、後の章で詳しく説明する。
case
は、if
文のようにスコープを導入しない。if
またはelse
スコープ内の操作が終了すると、if
文全体の評価も終了する。これは、case
セクションでは起こらない。一致するcase
が見つかったら、プログラムの実行はそのcase
にジャンプし、その下の操作を実行する。まれな状況で必要な場合、goto case
はプログラムの実行を次のcase
にジャンプさせる。
value
が5の場合、case 5
行の下で実行が続き、プログラムは"five"を出力する。その後、goto case
文により、実行は次のcase
に進み、その結果、"four"も出力される。
five
four
goto
case
セクションでは、3つの方法で現れる可能性がある:
-
goto case
次のcase
まで実行が継続(fallthrough)する。 goto default
実行をdefault
セクションまで継続させる。goto case expression
その式と一致するcase
まで実行を継続する。
次のプログラムは、foreach
ループを利用して、これらの3つの使用方法を示している。
出力:
値 | switch |
---|---|
1 | case 1 |
case 2 | |
case 10 | |
2 | case 2 |
case 10 | |
3 | case 3 |
default | |
10 | case 10 |
20 | default |
式は、整数、文字列、またはbool
型でなければならない。
if
文の等価比較では、あらゆる型を使用できる。一方、switch
式の型は、すべての整数型、すべての文字列型、およびbool
に限定される。
注釈:上記のコードは、操作がプログラムによって認識されない場合に例外をスローする。例外については、後の章で説明する。
bool
式も使用することは可能だが、bool
には2つの値しかないので、その型にはif
文または三項演算子(?:
)を使用するほうが適しているかもしれない。
値の範囲
値の範囲は、case
の間に..
で指定できる。
上記のコードは、サイコロの値が 2、3、4、または5の場合にゲームが引き分けで終了することを決定する。
異なる値
値[2, 5]の範囲にある値ではなく、値2と4が引き分けであると仮定しよう。case
の異なる値は、コンマで区切る。
final switch
文
final switch
文は、通常のswitch
文とよく似ているが、以下の点が異なる。
default
セクションを含めることはできない。上記のサイコロの6つの値のように、case
セクションが値の範囲全体をカバーしている場合は、このセクションは意味がないことに注意。- 値の範囲は、
case
では使用できない (個別の値は使用可能)。 - 式が
enum
型の場合、その型のすべての値はcase
でカバーされている必要がある(enum
型については次の章で説明する)。
いつ使用する
switch
は、式値をコンパイル時に既知の値のセットと比較するのに適している。
比較する値が2つしかない場合は、if
文の方がより適切だ。例えば、表か裏かをチェックするには、次のようにする。
原則として、比較する値が3つ以上ある場合は、switch
の方が適している。
すべての値を処理する必要がある場合は、final switch
を使用することをお勧めする。これは、enum
型の場合に特に当てはまる。
演習
- 算術演算をサポートする計算機プログラムを作成しよう。プログラムは、まず演算を
string
として読み込み、次に2つの値をdouble
型として入力から読み込む。計算機は演算の結果を出力する。例えば、演算と値がそれぞれ"add"と"5 7"の場合、プログラムは12を出力する。入力は、以下のコードのように読み込むことができる。
- "add"のような単語に加えて"+"のような演算子もサポートするように計算機を改善しよう。
- 未知の演算子については、プログラムが例外をスローするようにしよう。例外については、後の章で説明する。とりあえずは、上記の
throw
文をプログラムに適用しよう。