1. はじめに
C言語における条件分岐は、プログラムの流れを制御するための重要な要素です。その中でも if
文は、条件に応じて異なる処理を実行するための基本的な構造です。しかし、実際のプログラムでは「1つの条件だけでなく、複数の条件を組み合わせる」ことが必要になる場面が多くあります。
例えば、以下のような状況を考えてみましょう。
例: 「変数
a
が 10 以上で、かつb
が 5 未満なら処理を実行する」
このような場合、C言語では論理演算子(&&, ||)やネスト(ifの入れ子)を使って条件を組み合わせることができます。本記事では、C言語の if 文で複数の条件を扱う方法について、基本から応用まで詳しく解説します。
2. C言語のif文の基本
2.1. if文の基本構造
C言語における if
文は、指定した条件が真(true)である場合に、特定の処理を実行します。
if (条件) {
// 条件が真のときの処理
}
例:変数 x
が 10 以上ならメッセージを表示
#include <stdio.h>
int main() {
int x = 15;
if (x >= 10) {
printf("xは10以上です。
");
}
return 0;
}
2.2. if-else文の基本構造
if
文に else
を加えることで、条件が偽(false)の場合の処理を記述できます。
if (条件) {
// 条件が真のときの処理
} else {
// 条件が偽のときの処理
}
例:ユーザーの入力した数値が正の数かどうかを判定
#include <stdio.h>
int main() {
int num;
printf("整数を入力してください: ");
scanf("%d", &num);
if (num > 0) {
printf("入力された数は正の数です。
");
} else {
printf("入力された数は正の数ではありません。
");
}
return 0;
}
2.3. if-else if-else文の基本構造
複数の条件をチェックしたい場合は else if
を使用します。
if (条件1) {
// 条件1が真の場合の処理
} else if (条件2) {
// 条件2が真の場合の処理
} else {
// すべての条件が偽の場合の処理
}
例:入力された点数に応じて成績を表示
#include <stdio.h>
int main() {
int score;
printf("点数を入力してください: ");
scanf("%d", &score);
if (score >= 80) {
printf("成績: A
");
} else if (score >= 60) {
printf("成績: B
");
} else {
printf("成績: C
");
}
return 0;
}
3. if文で複数の条件を扱う方法
3.1. 論理演算子(&&, ||)の活用
C言語では、複数の条件を &&
(AND演算子)や ||
(OR演算子)を使って組み合わせることができます。
✅ &&
(AND演算子)
- すべての条件が満たされた場合に実行される
#include <stdio.h>
int main() {
int a = 15, b = 3;
if (a > 10 && b < 5) {
printf("aは10より大きく、bは5より小さいです。
");
}
return 0;
}
✅ ||
(OR演算子)
- どちらか一方の条件が満たされれば実行される
#include <stdio.h>
int main() {
int a = 8, b = 3;
if (a > 10 || b < 5) {
printf("aが10より大きいか、bが5より小さいです。
");
}
return 0;
}
✅ !
(NOT演算子)
- 条件を逆にする
#include <stdio.h>
int main() {
int a = 8;
if (!(a > 10)) {
printf("aは10以下です。
");
}
return 0;
}
3.2. if文のネスト(入れ子)
if
文の中にif
文を入れることで、より細かい条件分岐が可能
例:年齢と身長の両方をチェック
#include <stdio.h>
int main() {
int age = 20, height = 170;
if (age >= 18) {
if (height >= 160) {
printf("成人であり、身長が160cm以上です。
");
} else {
printf("成人ですが、身長が160cm未満です。
");
}
} else {
printf("未成年です。
");
}
return 0;
}
4. 複数条件を扱う際のベストプラクティス
4.1. 可読性の向上
4.1.1. 条件式を分割する
int isEligibleForDiscount = (score >= 80);
int isAdult = (age >= 18);
int isMemberValid = (isMember == 1);
if (isEligibleForDiscount && isAdult && isMemberValid) {
printf("優待対象者です。
");
}
4.1.2. 条件式を関数化する
#include <stdio.h>
int isEligible(int score, int age, int isMember) {
return (score >= 80 && age >= 18 && isMember == 1);
}
int main() {
int score = 85, age = 20, isMember = 1;
if (isEligible(score, age, isMember)) {
printf("優待対象者です。
");
} else {
printf("優待対象者ではありません。
");
}
return 0;
}
4.2. パフォーマンスの考慮
4.2.1. 短絡評価(ショートサーキット)を活用する
if (a != 0 && b / a > 1) {
printf("計算結果: %d
", b / a);
}
4.2.2. 評価順を最適化する
if (a > 0 && isHeavyCalculation()) {
printf("処理を実行
");
}
4.3. メンテナンス性の向上
4.3.1. 条件式の分かりやすさを意識する
if (user.age >= 18 && user.score >= 50) {
printf("条件を満たしています。
");
}
4.3.2. マジックナンバーを避ける
#define ADULT_AGE 18
if (age >= ADULT_AGE) {
printf("成人です。
");
}

5. 実践例:if文を使ったプログラム
5.1. ユーザーの年齢に応じたメッセージを表示
#include <stdio.h>
int main() {
int age;
printf("年齢を入力してください: ");
scanf("%d", &age);
if (age >= 18 && age < 65) {
printf("あなたは成人です。
");
} else if (age >= 65) {
printf("あなたはシニアです。
");
} else {
printf("あなたは未成年です。
");
}
return 0;
}
5.2. ログイン認証の簡易プログラム
#include <stdio.h>
#include <string.h>
int main() {
char username[20];
char password[20];
printf("ユーザー名: ");
scanf("%s", username);
printf("パスワード: ");
scanf("%s", password);
if (strcmp(username, "admin") == 0 && strcmp(password, "1234") == 0) {
printf("ログイン成功!
");
} else {
printf("ログイン失敗...
");
}
return 0;
}
5.3. 三角形の判定プログラム
#include <stdio.h>
int main() {
int a, b, c;
printf("三角形の3辺を入力してください: ");
scanf("%d %d %d", &a, &b, &c);
if (a == b && b == c) {
printf("正三角形です。
");
} else if (a == b || b == c || a == c) {
printf("二等辺三角形です。
");
} else {
printf("不等辺三角形です。
");
}
return 0;
}
5.4. 数値の範囲チェック
#include <stdio.h>
int main() {
int number;
printf("数値を入力してください: ");
scanf("%d", &number);
if (number >= 50 && number <= 100) {
printf("適切な数値です。
");
} else {
printf("範囲外です。
");
}
return 0;
}
6. FAQ(よくある質問)
6.1. if文とswitch文はどちらを使うべき?
if文を使うべき場面
- 範囲(大小比較)が必要な場合
- 複雑な論理式を用いる場合
if (score >= 90) {
printf("成績: A
");
} else if (score >= 80) {
printf("成績: B
");
} else {
printf("成績: C
");
}
switch文を使うべき場面
- 特定の値(整数や文字)を判定する場合
switch (grade) {
case 'A':
printf("優秀です。
");
break;
case 'B':
printf("良い成績です。
");
break;
default:
printf("無効な評価です。
");
}
6.2. if文のネストと論理演算子、どちらを使うべき?
ネストを使う場合
if (age >= 18) {
if (hasID) {
printf("入場できます。
");
} else {
printf("身分証明書が必要です。
");
}
}
論理演算子を使う場合
if (age >= 18 && hasID) {
printf("入場できます。
");
}
6.3. if文の条件をシンプルに書く方法
三項演算子を使う
int result = (a > 10) ? 1 : 0;
条件を関数化する
int isAdult(int age) {
return age >= 18;
}
if (isAdult(age)) {
printf("成人です。
");
}
6.4. if文の条件が間違って動作しない場合の原因
=
(代入演算子)と ==
(比較演算子)の間違い
if (x == 5) {
printf("xは5です。
");
}
条件の優先順位を明示する
if ((a > 10 && b < 5) || c == 3) {
printf("条件成立
");
}
浮動小数点の比較
#include <math.h>
if (fabs(a - b) < 0.0001) {
printf("aとbはほぼ等しい。
");
}
7. まとめ
7.1. if文の基本構造
if (条件) {
// 条件が真のときの処理
} else {
// 条件が偽のときの処理
}
7.2. if文で複数の条件を扱う方法
論理演算子の活用
if (age >= 18 && hasID) {
printf("入場できます。
");
}
ネストの活用
if (age >= 18) {
if (hasID) {
printf("入場できます。
");
} else {
printf("身分証が必要です。
");
}
}
7.3. 可読性・パフォーマンスを考慮した書き方
条件を関数化
int isEligible(int score, int age) {
return (score >= 80 && age >= 18);
}
if (isEligible(85, 20)) {
printf("優待対象です。
");
}
短絡評価の活用
if (a != 0 && b / a > 1) {
printf("計算結果: %d
", b / a);
}
7.4. 実践的な活用例
if (age >= 18 && age < 65) {
printf("成人です。
");
}
if (strcmp(username, "admin") == 0 && strcmp(password, "1234") == 0) {
printf("ログイン成功!
");
}
if (number >= 50 && number <= 100) {
printf("適切な数値です。
");
}
7.5. よくある間違いとその対策
if (x == 5) {
printf("xは5です。
");
}
if ((a > 10 && b < 5) || c == 3) {
printf("条件成立
");
}
#include <math.h>
if (fabs(a - b) < 0.0001) {
printf("aとbはほぼ等しい。
");
}
7.6. 本記事の総括
✅ C言語の if
文をマスターすることで、プログラムの制御がより柔軟になる!
✅ 複数条件の組み合わせには、論理演算子とネストを適切に使い分ける!
✅ 可読性とパフォーマンスを意識し、コードの最適化を図る!
✅ 実践的な例を通じて、エラーを防ぎながら正しく記述する!
7.7. これからの学習に向けて
今後、より高度な制御構造(switch
文、while
ループなど)や関数の活用について学ぶことで、さらに柔軟なプログラムが作成できるようになります。
C言語のスキルを磨いて、より良いプログラミングを目指しましょう!