こんにちは!こんばんは!
ちゃとらです(・ω・)/
使いそうだけどなんか影が薄くて書き方も忘れそうなswitch文。
僕なりにswitch文の特徴や使い方、注意点などをまとめてみました。
switch文について分かりやすい解説していきます!
switch文とは
説明
switch文とは、多方向条件処理ができる条件分岐処理の一種です。
複数の場合分けから値が合致する所の処理のみが実行されます。
if else-if else文と同じような処理を実現することができます。
しかし、文字列の判定や数値範囲の判定などの処理はできません。
// switch文の記述方法
switch(式)
{
case 定数式1:
~
break;
case 定数式2:
~
break;
default:
~
}
式の値に合致した定数式のcase処理のみ実行される。どの定数式にも当てはまらない場合は、default処理のみ実行される。
式には整数の変数もしくは演算式が入る。実数は入らない。また、条件式ではない。
定数式には整数の定数か文字定数が入る。実数や条件式、文字列は入らない。
注意点としては、式には実数が入らず条件式でもないことです。
また、定数式には10や’A’などの定数は入りますが、5.5などの実数や”ABC”などの文字列は入りません。
サンプルコード
まずは、switch文を使った基本的なプログラムです。
#include <stdio.h>
int main(void)
{
int i;
printf("整数を入力:");
scanf("%d", &i);
switch (i)
{
case 1:
printf("入力された値は1\n");
break;
case 2:
printf("入力された値は2\n");
break;
default:
printf("1,2以外の値が入力されました\n");
}
return 0;
}
整数を入力:1
入力された値は1
整数を入力:2
入力された値は2
整数を入力:100
1,2以外の値が入力されました
入力された値によって処理が切り替わっているのが分かるかと思います。
次プログラムのように、複数のcase句をまとめることもできます。
#include <stdio.h>
int main(void)
{
char c;
printf("1文字を入力:");
scanf("%c", &c);
switch (c)
{
case 'A':
case 'B':
case 'C':
printf("入力された文字はA,B,Cのどれかです\n");
break;
case 'D':
case 'E':
case 'F':
printf("入力された文字はD,E,Fのどれかです\n");
break;
default:
printf("A,B,C,D,E,F以外の文字が入力されました\n");
}
return 0;
}
1文字を入力:A
入力された文字はA,B,Cのどれかです
1文字を入力:B
入力された文字はA,B,Cのどれかです
1文字を入力:D
入力された文字はD,E,Fのどれかです
1文字を入力:Z
A,B,C,D,E,F以外の文字が入力されました
このように、いくつかのcaseの処理をまとめることもできます。
用途
switch文の使い道としては、if else-if else文の代用です。
ぶっちゃけswitch文でできることはif else-if else文でもできます。むしろ、switch文の方は制約があるのでif else-if else文でできること全てをカバーできません。
しかし、プログラムによってはswitch文で書いた方が見やすくかつカッコよくなる場合があります。
「switch文で綺麗にプログラム書けそうだ!」と思ったらswitch文を使ってみてください。
フォロースルー
caseの最後には必ずbreak文が入っているけど必要なの?
break文はよっぽどのことがないかぎり必須となります。
多くのプログラムの場合、各caseにbreak文が入っていないと自分が思うような処理ができなくなってしまいます。
caseの中にbreak文が入っていないとその後のcase処理・default処理を実行してしまうフォロースルーが発生してしまいます。
以下のプログラムは、実際にフォロースルーが発生するものです。
#include <stdio.h>
int main(void)
{
char c;
printf("1文字を入力:");
scanf("%c", &c);
switch (c)
{
case 'A':
printf("入力された文字はA\n");
case 'B':
printf("入力された文字はB\n");
case 'C':
printf("入力された文字はC\n");
default:
printf("入力された文字はA,B,C以外の文字\n");
}
return 0;
}
1文字を入力:A
入力された文字はA
入力された文字はB
入力された文字はC
入力された文字はA,B,C以外の文字
1文字を入力:B
入力された文字はB
入力された文字はC
入力された文字はA,B,C以外の文字
1文字を入力:C
入力された文字はC
入力された文字はA,B,C以外の文字
明らかに実行結果がおかしくなってしまっていますね。
break文が各caseに入っていないと、式の値と合致するcase処理とそれ以降のcase・default処理も実行されてしまいます。
フォロースルーが発生しないようにcaseの中には必ずbreak文を入れるようにしましょう!
まとめ
switch文を使う際は、様々なルールに注意です!
今回はここまでです。
ちゃとら(・ω・)/