C言語での分岐処理記述方法は3つあります。
if文、switch文、3項演算子の3種類です。
ここでは、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;
}
コメント