プログラミングをしていますと、ある複数の条件の中から、いずれかに一致したときに、その条件に応じた処理を実行したい、というケースがありますね。
特定の条件に応じて処理を分岐するために if文 を使うことが一般的ですが、処理を分岐する条件が多数に及ぶ場合、
プログラムの読みやすさが低下してしまう恐れがあります。
そのためC言語では、複数の条件がある分岐処理を分かりやすく表現できるよう、switch文 が用意されています。
今回のC言語超入門は、多方向分岐を行う switch文 の使い方について解説していきます。

switch文の書式

switch文 の基本的な書式は以下のとおりです。

switch (式) {
	case 定数式1:
	    処理文;
	    break;
	case 定数式2:
	    処理文;
	    break;
	    :
	    :
	default:
	    処理文;
}

switch文は式を評価し、評価結果と一致するcaseに処理を分岐して実行します。
もし式と一致するcaseがないときは、自動的にdefault文に記述した処理を実行します。
なお、default文の記述は必須ではありませんので、必要ない場合は省略することができます。

switch文の基本的な使い方

if文 と switch文 は、どちらも分岐処理を行いますが、複数の条件がある分岐処理を行う場合は、
switch文 で記述した方が、プログラムの流れが分かりやすくなります。
プログラム例を参考に、switch文 の基本的な使い方を見ていきましょう。
以下のプログラム1は、0〜6の数値ごとに処理を分岐して、数値が0なら「日曜日」、1なら「月曜日」・・・、6なら「土曜日」と表示するプログラムです。
 

/* プログラム1 */
# include <stdio.h>
main() {
	int weekNumber = 3;
	switch (weekNumber) {
	    case 0:
	        printf("weekNumber=%d  日曜日です。\n", weekNumber);
	        break;
	    case 1:
	        printf("weekNumber=%d  月曜日です。\n", weekNumber);
	        break;
	    case 2:
	        printf("weekNumber=%d  火曜日です。\n", weekNumber);
	        break;
	    case 3:
	        printf("weekNumber=%d  水曜日です。\n", weekNumber);
	        break;
	    case 4:
	        printf("weekNumber=%d  木曜日です。\n", weekNumber);
	        break;
	    case 5:
	        printf("weekNumber=%d  金曜日です。\n", weekNumber);
	        break;
	    case 6:
	        printf("weekNumber=%d  度曜日です。\n", weekNumber);
	        break;
	    default:
	        printf("weekNumber=%d  ???\n", weekNumber);
	}
}
※プログラム1の実行結果
weekNumber=3  水曜日です。

では、このプログラム1を使って、switch文のポイントをご説明していきます。

switch文の「式」と「定数式」は整数型のみ有効

「switch (式)」の「式」に該当する箇所と、「case 定数式:」の「定数式」に該当する箇所は、整数型でなければなりません。
例えば以下のように、式にdouble型の変数を使うことはできません。

	double x = 3.14;
	switch (x) {
	    case 3.14:
	        :
	        :

また定数式には、以下のように、条件式や文字列を記述することもできません。

	    int x, y;
	    switch (x) {
	        case  y>10:
	        case "Windows":
	            :
	            :

もし、上記のような使い方をしたい場合は、if文を使って条件分岐を表現します。

caseは処理の実行範囲を定めるものではない

switch文を使ったプログラム1を見ますと、case文が実行範囲を指定しているように見えるかもしれません。
ですがC言語においてcaseは、分岐先のラベルとしての役割しかありません。
つまり分岐処理を終わらせたいときは、break文が必要です。
break文または、switch文の終了まで処理の実行が続きます。
break文が見つかるまで処理が実行される特性を逆手に取りますと、複数のcaseラベルで同じ処理文を実行させることもできます。
以下のプログラム2は、ある月の日数を表示するプログラムです。
caseラベルとbreak文の関係に注目してみてください。

/* プログラム2 */
# include <stdio.h>
main() {
	int month;
	for (month=1; month<=12; month++) {
	    switch (month) {
	        case 1:
	        case 3:
	        case 5:
	        case 7:
	        case 8:
	        case 10:
	        case 12:
	            printf("%d月は31日あります。\n", month);
	            break;
	        case 4:
	        case 6:
	        case 9:
	        case 11:
	            printf("%d月は30日あります。\n", month);
	            break;
	        case 2:
	            printf("%d月は28日(うるう年は29日)あります。\n", month);
	    }
	}
}
※プログラム1の実行結果
1月は31日あります。
2月は28日(うるう年は29日)あります。
3月は31日あります。
4月は30日あります。
5月は31日あります。
6月は30日あります。
7月は31日あります。
8月は31日あります。
9月は30日あります。
10月は31日あります。
11月は30日あります。
12月は31日あります。

switch文の代わりにif文を使うことも可能

switch文を使ったプログラムは、if文を使って表現することもできます。
以下のプログラム3は、プログラム1と同じ動作をするように、if文で表現したプログラムです。

/* プログラム3 */
# include <stdio.h>
main() {
	int weekNumber = 3;
	if (weekNumber == 0) {
	    printf("weekNumber=%d  日曜日です。\n", weekNumber);
	} else if (weekNumber == 1) {
	    printf("weekNumber=%d  月曜日です。\n", weekNumber);
	} else if (weekNumber == 2) {
	    printf("weekNumber=%d  火曜日です。\n", weekNumber);
	} else if (weekNumber == 3) {
	    printf("weekNumber=%d  水曜日です。\n", weekNumber);
	} else if (weekNumber == 4) {
	    printf("weekNumber=%d  木曜日です。\n", weekNumber);
	} else if (weekNumber == 5) {
	    printf("weekNumber=%d  金曜日です。\n", weekNumber);
	} else if (weekNumber == 6) {
	    printf("weekNumber=%d  土曜日です。\n", weekNumber);
	} else {
	    printf("weekNumber=%d  ???\n", weekNumber);
	}
}

C言語超入門の第25回まとめ

今回のC言語超入門では、いくつかの選択肢の中から多方向に分岐処理を行いたいときに便利なswitch文について、お伝えいたしました。
最後に、改めてswitch文のポイントをまとめておきます。
・switch文に記載した式を評価し、評価結果と一致するcaseに処理を分岐して実行する
・switch文による分岐は整数のみ。条件式や文字列は使用できない
・caseはラベルであり処理の実行範囲を決めるものではない
ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。