条件式 - switch文

前のページではif文について解説した。今回はif - else文をたくさん使うようなプログラムではswitch文を使うとよい事を解説する。
if -else if文がたくさんのサンプルコード
if文は分岐と解説したが、たくさん分岐させたいならたくさん書けばよい事は分かると思う。例えば下記のコードだ。
let pet = "トカゲ";
if(pet === "犬") {
alert("ドッグフードをどうぞ!");
}
else if(pet === "猫") {
alert("キャットフードをどうぞ!");
}
else if(pet === "うさぎ") {
alert("うさぎのフードをどうぞ!");
}
else if(pet === "ハムスター") {
alert("ハムスターのフードをどうぞ!");
}
else if(pet === "トカゲ") {
alert("トカゲのフードをどうぞ!");
}
else {
alert("そちらのペット商品は取り扱っていません");
}
上記コードはelse if文がたくさんあるな。これでも別に良いのだがswitch文を使えばもっと見やすくコードを修正したりする保守がしやすくなるので確認してくれ。
switch文のサンプルコード
上のif文のサンプルコードと同じ処理をするコードをswitch文で書くとこうなる。
let pet = "トカゲ";
switch (pet) {
case "犬" :
alert("ドッグフードをどうぞ!");
break;
case "猫" :
alert("キャットフードをどうぞ!");
break;
case "うさぎ" :
alert("うさぎのフードをどうぞ!");
break;
case "ハムスター" :
alert("ハムスターのフードをどうぞ!");
break;
case "トカゲ" :
alert("トカゲのフードをどうぞ!");
break;
default :
alert("そちらのペット商品は取り扱っていません");
}
switch文の解説
まず下記のコードのようにswitchの横にあるカッコの中身が検索対象となる値だ。
petにはサンプルのコードだと「トカゲ」という文字列が入っているのでswitch文はその値を探す。
switch (pet) {
上のswitchで検索させる値とcaseの値が同じならcaseの中のコードが実行される。尚、下記コードは犬だったらという意味なので、検索する値はトカゲなので条件に合わずスルーされ、次のcaseが評価される。
case "犬" :
変数はトカゲという文字列が入っているので、caseがトカゲの下記のコードがヒットする。
case "トカゲ" :
alert("トカゲのフードをどうぞ!");
break;
ヒットしたトカゲのalertが実行された後にbreakが実行される。このbreakがないと下のコードが実行されてしまう。
switch文のbreakがないとどうなるか?
switch文は値を検索し、ヒットしたら下のコードを実行する。例えば次のようなswitch文がある。
let value = 10;
switch (true) {
case value > 10:
alert("値は10より上");
case value > 1:
alert("値は1より上");
case value > 100:
alert("値は100より上");
}
このコードは論理値(true)がヒットしたらcaseの下のコードを実行する。valueの値は10である。
case value > 10:
まずこのコードが評価されるが、valueは10なので11より上の数字がこのcaseは真(true)になる。今回は10以下なのでfalseの為、その下のalertは実行されない。
case value > 1:
次にこのコードが評価される。valueは10で10は1より上の数字なのでこの式は真(true)となる。switchの条件はtrueを探す事なのでこのcaseの下のコードが実行される。
case value > 1:
alert("値は1より上");
case value > 100:
alert("値は100より上");
「値は1より上」このメッセージが表示されるのは分かると思うが、ここで不思議な事が起こる。その下にあるコードの「値は100より上」のメッセージも表示されてしまうのだ!
switch文を使うときはbreakを書かないとバグになるので注意!
この仕様をフォールスルーという。実は古いほとんどのプログラミング言語はこういう仕様になっているが、割と新しめのプログラミング言語はフォールスルーにならないような仕様になっている。また、プログラミング言語のバージョンによっても変わる可能性があるので、調べてみたい方は仕様をチェック!
switchのdefaultとは
defaultは通常はswitch文の一番下に書く。defaultは1つもcaseに該当がなかった場合に実行されるのでif文のelseに相当するな。elseは最後に書くがdefaultはswitch文のどこに書いても良い。最後に書いたdefaultはこれ以上に下にコードがないのでbreakは書かなくてよいが、下にcaseがある場合にbreakがないとフォールスルーで下のcaseが実行されてしまうので注意!