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; }
コメント