C初級:switch文による分岐処理

C言語初級カテゴリのロゴ画像C言語初級
スポンサーリンク

C言語での分岐処理記述方法は3つあります。
if文、switch文、3項演算子の3種類です。
ここでは、switch文の書き方について説明します。

スポンサーリンク

switchは多分岐型

switchは多分岐と言われています。
イメージは、こんな感じです。

switch文のイメージ画像

これをそのままC言語プログラムになおすとこんな感じです。

サンプルプログラム switch1.c

/* switch1.c */
#include <stdio.h>
int main(void)
{
	int a;
	
	printf("1~3 ? ");
	scanf("%d", &a);
	
	switch(a){
		case 1:
			printf("処理A\n");
			break;
		case 2:
			printf("処理B\n");
			break;
		case 3:
			printf("処理C\n");
	}
	
	return 0;
}

解説
キーボードから入力した変数aの値が1のときは、「処理A」、2のとき「処理B」、3のとき「処理C」と表示して終了するプログラムです。
switch文の基本形はこうなります。

switch(変数){
case 定数1:
処理
break;
case 定数2:
処理2
break;
:
:
}

上記サンプルプログラムの場合、switch(a)として変数aを指定しています。
caseに最初1を指定しています。意味は、変数aの値が1と一致するとき、「処理A」と表示せよ。
となります。

breakは処理を抜ける

switch文のポイントは、break文の使い方にあります。
break文は{}(処理ブロック)を抜けるという振る舞いをします。
ですから、もし変数aが1で、「処理A」と表示した場合、}の次のreturn 0; に移動してプログラムを終了します。

break文がない場合の例もみてください。

サンプルプログラム switch1-1.c

/* switch1-1.c */
#include <stdio.h>
int main(void)
{
	int a;
	
	printf("1~3 ? ");
	scanf("%d", &a);
	
	switch(a){
		case 1:
			printf("処理A\n");
		/*	break; */
		case 2:
			printf("処理B\n");
		/*	break; */
		case 3:
			printf("処理C\n");
	}
	
	return 0;
}

解説
break文が無い場合のswitch文は、処理が若干変わります。
例えば、変数aの値が1だった場合、「処理A」と画面に表示するところまでは、同じですが、その後の「処理B」「処理C」も続けて表示されてしまいます。
break文が無いためそのまま下に下にと処理を実行したことになります。

実行イメージ

1~3 ? 1 [Enter]
処理A
処理B
処理C

elseと同じ意味のdefault

if文には、条件が成り立つ以外(それ以外)といった意味のelse句が存在します。
switch文も同じ意味のdefault句が存在します。

以下のサンプルでは、変数aが1, 2, 3以外なら「範囲外です」と表示するようにしています。

サンプルプログラム switch2.c

/* switch2.c */
#include <stdio.h>
int main(void)
{
	int a;
	
	printf("1~3 ? ");
	scanf("%d", &a);
	
	switch(a){
		case 1:
			printf("処理A\n");
			break;
		case 2:
			printf("処理B\n");
			break;
		case 3:
			printf("処理C\n");
			break;
		default:
			printf("範囲外です\n");
	}
	
	return 0;
}

実行イメージ

1~3 ? 4 [Enter]
範囲外です

これをそのままif文に直すとこんな感じです。
ほぼdefaultはelseに置き換わります。まあ、ほとんど変わりませんね。

/* switch2if.c */
#include <stdio.h>
int main(void)
{
	int a;
	
	printf("1~3 ? ");
	scanf("%d", &a);
	
	if(a == 1){
		printf("処理A\n");
	}
	else if(a == 2){
		printf("処理B\n");
	}
	else if(a == 3){
		printf("処理C\n");
	}
	else{
		printf("範囲外です\n");
	}
	
	return 0;
}

switch文は、整数定数の判定しかできない

switch文には1つ注意点があります。
caseに指定できるのは、整数でかつ定数である必要がある、ということです。

以下のようにcaseに変数は指定できません。コンパイルエラーになります。

#include <stdio.h>
int main(void)
{
	int a, b = 1;
	
	printf("1~3 ? ");
	scanf("%d", &a);
	
	switch(a){
		case b:
			printf("処理A\n");
			break;
		default:
			printf("範囲外です\n");
	}
	
	return 0;
}

整数以外では、case ‘A’: のような記述は可能ですが、case 1.5: や case “ABC”: のような実数と文字列もコンパイルエラーとなります。

switchでドラクエ風メニュー

遊び
switch文を使ってドラクエ風の判定文を作ってみました。

/* switch3.c */
#include <stdio.h>
int main(void)
{
	int menu;
	
	printf("ドウスル?\n");
	printf("1: 攻撃 2: 防御 3: 魔法 4: 逃げる > ");
	scanf("%d", &menu);
	
	switch(menu){
		case 1:
			printf("\nトルネコはスライムに2ダメージ与えた!!\n");
			break;
		case 2:
			printf("\nトルネコは守っている。\n");
			break;
		case 3:
			printf("\nトルネコはザキの呪文を唱えた!\n");
			printf("しかし、スライムには効かなかった。\n");
			break;
		case 4:
			printf("\nトルネコは逃げ出した...が追いつかれてしまった。\n");
			break;
		default:
			printf("\nそんな命令はない!\n");
	}

	return 0;
}

コメント