switch文

C言語 / C++

switch(x){
case 1:
  ...;
  break;
case 2:
  ...;
  break;
default:
  ...;
  break;
}

break を書かないとswitch文から脱出せずに次のラベルを引き続き実行してしまう。(fall through)

enumも使える。

Java

C言語ライクのswitch文を使える。

switch (x) {
case 1:
  ...;
  break;
case 2:
  ...;
  break;
default:
  ...;
  break;
}

break を書かないとswitch文から脱出せずに次のラベルを引き続き実行してしまう。(fall through)

x には、byte, short, char, int, Byte, Short, Character, Integer, enum, String が使える。

String が使えるのは、Java7からである。

String の場合、実行時に null が与えられると、NullPointerException が発生してしまい、 case null と書けたり、 default に飛んでくれたりはしない。 Integer の場合も、NullPointerException が発生しうるのは同様。

Byte, Short, Character, Integer が使えるのは、たぶん autoboxing が導入された Java5 から。

The switch Statement | Java Language Specification
http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.11

Scala

C言語ライクの構文はないが、より強力なmatch式がある。

x match {
  case 1 =>
    ...;
  case 2 =>
    ...;
  case _ =>
    ...;
}

C言語やJavaのように fall through することはない。

関数本体がmatch式のみの場合は以下のように省略した書き方ができる。

val f: Int => Int = {
  case 1 => ...;
  case 2 => ...;
  case _ => ...;
}

C言語のdefaultに相当するものは case _ と書けばよい。

match式は値を返すので、いずれのケースにもマッチしない場合に scala.MatchError の例外が発生してしまう。 case _ があればいいのだが。

match式の中はすべてのケースを網羅しきれていないコンパイラが判断したときには警告が発生する。

PHP

C言語ライクのswitch文を使える。

switch ($x) {
case 1:
  ...;
  break;
case 2:
  ...;
  break;
default:
  ...;
  break;
}

break を書かないとswitch文から脱出せずに次のラベルを引き続き実行してしまう。(fall through) break の代わりに continue と書いてもswitch文から脱出できる。

caseでは、型が異なっていても変換して比較される。値はC言語と違って文字列も使える。

コロンを使った以下の記法も可能。

switch ($x):
case 1:
  ...;
  break;
case 2:
  ...;
  break;
default:
  ...;
  break;
endswitch;

Python

Pythonにはswitch構文はない。

Ruby

case x
when 1
  ...
when 2
  ...
else
  ...
end

C言語やJavaのように fall through することはない。

when節で条件にマッチするかどうかの判定は === 演算子が使われる。

Perl

use Switch;

switch($x) {
    case 1 { ...; }
    case 2 { ...; }
    else { print "Failed"; }
}

$xが文字列でcase値が数字でもマッチする。その逆でもマッチする。

Switch - Perlのswitch文 | perldoc.jp
http://perldoc.jp/docs/modules/Switch-2.09/Switch.pod

sh (シェルスクリプト)

case "$x" in
    start)
        ...
        ;;
    stop)
        ...
        ;;
    *)
        ...
        ;;
esac

esacってcaseを逆から読んだものだけど、これをタイプするの慣れないと難しいよね。

JavaScript

C言語ライクのswitch文を使える。

switch (x) {
  case 1:
    ...;
    break;
  case 2:
    ...;
    break;
  default:
    ...;
    break;
}

break を書かないとswitch文から脱出せずに次のラベルを引き続き実行してしまう。(fall through)

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク