まがりなりにも構造化言語と呼ばれるC 言語の中では,switch 文は,かなり特異な制御構造をしている.その switch 文の書き方について解説する.
次は, switch 文の標準的な使い方である.
switch (x) {
case 1 :
printf("one");
break;
case 2 :
printf("two");
break;
default :
printf("other");
break;
}
この switch 文を実行すると,変数 x (必ず int 型でなければならない)の値が 1 のときは one,2のときは two,それ以外のときは other を表示する.
ここで注意すべき点は,それぞれの場合に実行される部分の最後に break がついていることである(最後の default についた break は必要ではない).
なぜ,break が必要なのか.その理由は, switch 文が本質的には goto 文であることにある.
switch (x) {
case 1 :
printf("one");
case 2 :
printf("two");
default :
printf("other");
}
上の switch 文は,goto 文で書かれた次のものに同じである.
if (x == 1) goto case1;
if (x == 2) goto case2;
goto defaultcase;
case1 :
printf("one");
case2 :
printf("two");
defaultcase :
printf("other");
これを実行すると, x の値が1のときは onetwoother ,2のときは twoohter,それ以外のときは other を表示する.したがって,x==1 のときには "one"の表示で止めたいときには, 次のように break をつける必要がある.この break により,switch 文本体,すなわち switch の直後の { } から抜け出ることになる.
case 1 :
printf("one");
break;
switch (x) {
case 1 :
printf("one");
break;
case 2 :
printf("two");
break;
default :
printf("other");
break;
}
上の switch 文を, goto 文で表すと次のようになる。
if (x == 1) goto case1;
if (x == 2) goto case2;
goto defaultcase;
case1 :
printf("one");
goto end;
case2 :
printf("two");
goto end;
defaultcase :
printf("other");
goto end;
end :;
ところで,switch 文は本質的に goto 文であるから,switch 文の本体内であれば,case ラベルはほとんど至る所に付けることができる.次の switch 文はまったく問題なく働く.
switch (a) {
case 1 :
printf("a==1");
if (b == 3) {
case 2 :
printf("a==1 and b==3 or a==2");
}
break;
default :
printf("other");
break;
}
しかし,このようなコーディングはあまり勧められない.
また,case ラベルをほとんど至る所に付けることができるとは言っても,入れ子になった内側の switch 文本体内には無理である.付けてもいいが,それは内側の switch 文のラベルとなる.
switch (a) {
case 1 :
printf("a==1");
break;
case 2 :
printf("a==2");
switch (b) {
case 1:
printf("b == 1");
case 3 : /* これは無理 */
printf("a == 3");
}
default :
printf("other");
break;
}