if文でも書けるのですが、if文より便利に見やすく書けるswitch文があります。
次のif文を見てください。
if (a == 1) {
printf("aは1\n");
} else if (a == 2) {
printf("aは2\n");
} else {
printf("aはその他\n");
}
これをswitchで書くと次のようになります。
switch (a) {
case 1: <-- aが1のときに通る
printf("aは1\n");
break;
case 2: <-- aが2のときに通る
printf("aは2\n");
break;
default: <-- aが1,2以外のときに通る
printf("aはその他\n");
}
見易いでしょう?
switch文は、ある式の値の1つの整数値と一致しているかどうかで分岐します。
上の例では、aが1と一致する場合ならここを、aが2と一致する場合ならここを通るという記述です。
switchの文法は、
switch (式)
case 定数式:文
case 定数式:文
default:文
}
です。
switch右の式の値が、caseの定数式と同じところの文を実行し、
どのcaseも通らなかったときにdefaultの分を実行します。
defaultが無い場合、どのcaseにも一致しない場合何も実行しません。
次の例を見てください。
switch (a) {
case 1: <-- aが1のときに通る
printf("aは1\n");
case 2: <-- aが2のときに通る
printf("aは2\n");
break;
default: <-- aが1,2以外のときに通る
printf("aはその他\n");
}
この例は、case 1 に break がありません。
a=1 のときにこれを実行すると、以下のように表示されます。
aは1
aは2
case 1 に breakがないので、case 2 の後の break が来るまで実行します。
break というのは case の終わりを意味しています。
書き忘れると、下の case まで実行してしまうので注意してください。
これをif文で書くとOR( if (a==1 || a==2) )が必要ですね。
a=1, a=2 も同じ処理の場合は以下のように書きます。
switch (a) {
case 1: <-- aが1のときに通る
case 2: <-- aが2のときに通る
printf("aは1または2\n");
break;
default: <-- aが1,2以外のときに通る
printf("aはその他\n");
}
case 1 と case 2 は同じ処理ですよという意図の表示でもあります。
if文とは使用方法が違いますね。
見易い方はどちらか、論理が分かり易い方はどちらかを考えて、if、switchを使い分けましょう。
この例を見てください。
ソースファイル名は prg.c
#include <stdio.h>
int main()
{
int ival=3;
switch ((ival+1)*2) {
case 0:
printf("case 0\n");
break;
case (ival<5):
printf("case 0\n");
break;
default:
printf("else\n");
}
}
コンパイル結果
gcc prg.c
prg.c: In function ‘main’:
prg.c:11:3: error: case label does not reduce to an integer constant
11 | case (ival<5):
case (ival<5) の記述が定数式ではなく、論理式なのでエラーとなります。
このような書き方はできません。
コメント