switch文を使いこなせばプログラミングも楽々!C言語の分岐処理をマスター
一般的に、if文の入れ子構造よりも簡潔で読みやすく、効率的な分岐処理を実現できます。
書き方
switch (式) {
case 値1:
処理1;
break;
case 値2:
処理2;
break;
...
default:
デフォルト処理;
}
解説
switch (式)
: 式の値を評価します。式は整数型または文字列型である必要があります。case 値1:
: 各分岐条件を示します。複数のcase
ラベルを並べて記述できます。処理1;
: 各分岐条件に対応する処理を記述します。break;
: 各分岐処理の終了を示します。break
がなければ、次のcase
ラベルまで処理が実行されます。default:
: 式の値がどのcase
にも一致しない場合の処理を記述します。省略することもできますが、記述しておくと望ましくない処理を防ぐことができます。
#include <stdio.h>
int main() {
int num = 3;
switch (num) {
case 1:
printf("1が出ました\n");
break;
case 2:
printf("2が出ました\n");
break;
case 3:
printf("3が出ました\n");
break;
default:
printf("それ以外の数字が出ました\n");
}
return 0;
}
このプログラムでは、変数num
の値に応じて、1、2、3が出た場合にそれぞれ異なるメッセージを出力します。
- switch文は、効率的な分岐処理を実現できますが、複雑な分岐の場合は、if文の組み合わせの方が読みやすくなる場合があります。
break
は省略可能ですが、省略すると、次のcase
ラベルまで処理が実行されてしまうため、必ず記述することを推奨します。
C言語のswitch文は、条件分岐を簡潔かつ効率的に記述できる便利な制御構造です。基本的な書き方と注意点、そして実用的な例を理解することで、プログラムの可読性と保守性を向上させることができます。
文字列による分岐
#include <stdio.h>
int main() {
char day[] = "月曜日";
switch (day[0]) {
case '月':
printf("おはようございます、月曜日\n");
break;
case '火':
printf("おはようございます、火曜日\n");
break;
case '水':
printf("おはようございます、水曜日\n");
break;
case '木':
printf("おはようございます、木曜日\n");
break;
case '金':
printf("おはようございます、金曜日\n");
break;
case '土':
printf("おはようございます、土曜日\n");
break;
case '日':
printf("おはようございます、日曜日\n");
break;
default:
printf("曜日が不明です\n");
}
return 0;
}
複数のcaseラベルに共通する処理
この例では、10以下の整数を3で割った余りによって、その数が何の倍数であるかを出力します。
#include <stdio.h>
int main() {
int num = 8;
switch (num % 3) {
case 0:
case 3:
printf("%dは3の倍数です\n", num);
break;
case 1:
case 2:
printf("%dは3の倍数ではありません\n", num);
break;
default:
printf("無効な数字です\n");
}
return 0;
}
この例では、1から5までの整数を引数として受け取り、その数の累乗を計算して出力します。
#include <stdio.h>
int main() {
int n = 3;
int result = 1;
switch (n) {
case 5:
result *= n; // fallthrough
case 4:
result *= n; // fallthrough
case 3:
result *= n;
break;
case 2:
result *= n;
break;
case 1:
result *= n;
break;
default:
printf("無効な数字です\n");
}
printf("%dの累乗は %d です\n", n, result);
return 0;
}
これらの例は、C言語におけるswitch文の様々な使用方法を示しています。状況に応じて適切な書き方を選択することで、プログラムをより読みやすく、効率的にすることができます。
- switch文の代わりにif文を使用する方が適切な場合もあります。
- switch文の中にif文を記述することもできます。
- 複数のswitch文を組み合わせることもできます。
if文
最も基本的な分岐処理の方法です。switch文よりも柔軟性が高く、複雑な条件分岐にも対応できます。
if (条件) {
処理1;
} else if (条件2) {
処理2;
} else {
処理3;
}
if-else if-else構造
複数の条件分岐を階層的に記述する方法です。switch文よりも読みやすく、理解しやすいコードになります。
if (条件1) {
処理1;
} else if (条件2) {
処理2;
} else if (条件3) {
処理3;
} else {
処理4;
}
ネストされたif文
条件が複雑に絡み合っている場合に使用する方法です。ただし、可読性が低下する可能性があるため、注意が必要です。
if (条件1) {
if (条件2) {
処理1;
} else {
処理2;
}
} else {
if (条件3) {
処理3;
} else {
処理4;
}
}
goto文
特殊な制御構造であり、非推奨です。プログラムの構造が複雑になり、保守性が低下する可能性があるため、よほどの理由がない限り使用すべきではありません。
goto label1;
label1:
処理1;
if (条件2) {
goto label2;
}
処理3;
label2:
処理4;
三項演算子
シンプルな条件分岐を簡潔に記述する方法です。ただし、複雑な条件分岐には対応できません。
int result = (条件) ? 値1 : 値2;
関数ポインタ
各分岐処理を関数として定義し、関数ポインタを使用して呼び出す方法です。高度なプログラミングテクニックであり、理解と使いこなしに難易度が高いです。
typedef void (*FunctionPtr)(void);
FunctionPtr funcPtrs[] = {
処理1関数,
処理2関数,
処理3関数,
};
int num = 2;
funcPtrs[num]();
マクロ
条件分岐をマクロとして定義する方法です。コードの簡潔化に役立ちますが、可読性が低下する可能性があるため、注意が必要です。
#define 処理1 if (条件1) { ... }
#define 処理2 else if (条件2) { ... }
#define 処理3 else { ... }
処理1;
処理2;
処理3;