C言語でif-elseの各ケースでステートメントを実行する最善の方法
if-else if-else 連鎖
これは最も基本的な方法です。各条件を個別にチェックし、条件に合致する場合は対応するステートメントを実行します。
if (condition1) {
// ステートメント1
} else if (condition2) {
// ステートメント2
} else {
// デフォルトのステートメント
}
利点:
- シンプルで分かりやすい
- 複雑な条件分岐にも対応可能
欠点:
- 条件の数が増えるとコードが冗長になる
- 最後のelse文は省略可能だが、デフォルトの処理を記述したい場合は必須
switch-case文
条件変数の値に基づいて、各ケースに記述されたステートメントを実行します。
switch (condition_variable) {
case value1:
// ステートメント1
break;
case value2:
// ステートメント2
break;
default:
// デフォルトのステートメント
}
- if-else if-else 連鎖よりも簡潔に記述できる
- 読みやすいコードになる
- 条件変数が整数型である必要がある
- 複雑な条件分岐には不向き
goto文
各ケースのラベルにジャンプして、ステートメントを実行します。
goto label1;
label1:
// ステートメント1
if (condition2) {
goto label2;
}
// ステートメント2
label2:
// ステートメント3
- 複雑な条件分岐を簡潔に記述できる
- コードの可読性が低下する
- goto文の乱用はバグの原因となる
マクロ
条件分岐をマクロで定義することで、コードを簡潔に記述できます。
#define CASE1(x) if (x == 1) { ... }
CASE1(condition_variable);
#define CASE2(x) if (x == 2) { ... }
CASE2(condition_variable);
- コードの冗長性を削減できる
- マクロの使い過ぎはコードの理解性を低下させる
最適な方法の選択
どの方法が最適かは、条件分岐の複雑さやコードの可読性などによって異なります。以下に、いくつかのヒントを紹介します。
- 条件の数が多い場合は、switch-case文の使用を検討しましょう。
- 複雑な条件分岐の場合は、if-else if-else 連鎖を使用しても構いませんが、コードの可読性を意識しましょう。
- goto文は慎重に使用しましょう。
- マクロはコードの冗長性を削減するために有効ですが、使い過ぎは避けてください。
#include <stdio.h>
int main() {
int num;
printf("数字を入力してください: ");
scanf("%d", &num);
if (num < 0) {
printf("%dは負の数です。\n", num);
} else if (num < 10) {
printf("%dは0から9までの数です。\n", num);
} else {
printf("%dは10以上の数です。\n", num);
}
return 0;
}
#include <stdio.h>
int main() {
int num;
printf("数字を入力してください: ");
scanf("%d", &num);
switch (num) {
case -1:
case -2:
case -3:
printf("%dは負の数です。\n", num);
break;
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
printf("%dは0から9までの数です。\n", num);
break;
default:
printf("%dは10以上の数です。\n", num);
}
return 0;
}
#include <stdio.h>
int main() {
int num;
printf("数字を入力してください: ");
scanf("%d", &num);
if (num < 0) {
goto negative;
} else if (num < 10) {
goto zero_to_nine;
} else {
goto ten_or_more;
}
negative:
printf("%dは負の数です。\n", num);
goto end;
zero_to_nine:
printf("%dは0から9までの数です。\n", num);
goto end;
ten_or_more:
printf("%dは10以上の数です。\n", num);
end:
return 0;
}
#include <stdio.h>
#define IS_NEGATIVE(x) ((x) < 0)
#define IS_ZERO_TO_NINE(x) ((0) <= (x) && (x) < (10))
int main() {
int num;
printf("数字を入力してください: ");
scanf("%d", &num);
if (IS_NEGATIVE(num)) {
printf("%dは負の数です。\n", num);
} else if (IS_ZERO_TO_NINE(num)) {
printf("%dは0から9までの数です。\n", num);
} else {
printf("%dは10以上の数です。\n", num);
}
return 0;
}
C++では、テンプレート関数を使用して、条件分岐を簡潔に記述できます。
#include <iostream>
template <typename T>
void print_value(const T& value) {
std::cout << value << std::endl;
}
int main() {
int num = 10;
double pi = 3.14;
print_value(num);
print_value(pi);
return 0;
}
ラムダ式
C++11以降では、ラムダ式を使用して、条件分岐を簡潔に記述できます。
#include <iostream>
int main() {
int num = 10;
auto print_message = [](int value) {
if (value > 0) {
std::cout << "正の数です。" << std::endl;
} else {
std::cout << "負の数です。" << std::endl;
}
};
print_message(num);
return 0;
}
三項演算子
三項演算子を使用して、条件分岐を1行で記述できます。
int result = (condition) ? value1 : value2;
例えば、
int num = 10;
int result = (num > 0) ? 1 : -1;
この場合、result
は1になります。
c if-statement