4-3 switch文

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) の記述が定数式ではなく、論理式なのでエラーとなります。
このような書き方はできません。

コメント

タイトルとURLをコピーしました