【2026年7月最新】C言語のif文完全ガイド|else・AND/OR・ネスト・switch比較・Claude Code活用法
この記事の内容
C言語を学ぶうえで最初に躓くポイントの一つが「if文(条件分岐)」の習得です。「特定の条件の時だけ処理を実行したい」「条件によって処理を分けたい」という場面で必ず使うのがif文で、C言語プログラミングの根幹をなす構文です。
C言語のif文はVBAやPythonのif文と基本概念は同じですが、括弧{}の使い方・比較演算子(==と=の違い)・論理演算子(&&や||の記号)など、C言語固有のルールがあります。
この記事ではC言語のif文に関する全知識を体系的に解説します。さらにClaude Codeを使ってC言語の条件分岐コードを自動生成する方法も紹介します。
01 C IF BASICS C言語のif文とは?条件分岐の基本構文 条件式が真(非ゼロ)か偽(ゼロ)かで処理を分岐させるC言語の基本構文
C言語のif文は、指定した条件が真(0以外)の場合に処理を実行する構文です。条件式を評価して「0以外(非ゼロ)ならTrue(真)」「0ならFalse(偽)」と判定するのがC言語のルールです。
📚 用語解説
if文(条件分岐):C言語の制御構造の一つ。「if (条件) { 処理 }」の形で使い、条件式が真(非ゼロ)の場合に中括弧{}内の処理を実行する。C言語ではTrue/Falseという値は存在せず、「0以外は真・0は偽」というルールで評価される。int型やchar型の変数も0か0以外かで真偽を判定できる。条件式には比較演算子(==, !=, >, <等)や論理演算子(&&, ||, !)を使う。
#include <stdio.h>
int main() {
int score = 85;
/* 基本のif文 */
if (score >= 80) {
printf("合格です\n"); /* 85 >= 80 は真なので実行される */
}
/* 必ず中括弧{}をつける(後述) */
int num = 0;
if (num) {
printf("numは0以外です\n"); /* 実行されない(0は偽) */
}
if (1) {
printf("1は真なので必ず実行される\n");
}
return 0;
}
C言語のif文の基本構文:
| 構文の要素 | 説明 | 注意点 |
|---|---|---|
| if | キーワード(小文字必須) | IF や If ではなく if と書く |
| () | 条件式を囲む丸括弧 | 必須。スペースを入れることが多い(if (条件)) |
| 条件式 | True/Falseに評価される式 | 0が偽・0以外が真。比較演算子・論理演算子を使う |
| {} | 処理を囲む中括弧 | 1行でも必ず付けることを推奨(省略可だが危険) |
| 処理 | 条件が真のときに実行するコード | {}内に複数の文を書ける |
02 C IF ELSE if-else文で2分岐を作る方法 条件が真の処理と偽の処理を両方書くif-elseの使い方
if-else文は条件が真のときの処理と偽のときの処理を両方書く2分岐の構文です。「もし〇〇ならAを実行、そうでなければBを実行」という処理に使います。
#include <stdio.h>
int main() {
int score = 72;
if (score >= 80) {
printf("合格\n"); /* 条件が真の場合 */
} else {
printf("不合格\n"); /* 条件が偽の場合(80未満) */
}
/* 72 < 80 なので「不合格」が表示される */
/* 別例: 整数の正負を判定 */
int num = -5;
if (num >= 0) {
printf("%d は非負の数\n", num);
} else {
printf("%d は負の数\n", num); /* -5は負 → こちらが実行される */
}
return 0;
}
else { if (...) {...} } のように書く代わりに、else ifを使うと同じ意味をより読みやすく書けます。次のセクションで詳しく説明しますが、「else」の後に直接「if」を続けて書くのが慣習です。
03 ELSE IF else if文で3つ以上の多分岐を作る方法 else ifを重ねて複数条件を順番にチェックする多段分岐を実装する
3つ以上の分岐が必要な場合はelse ifを使います。条件は上から順に評価され、最初に真になった条件の処理だけが実行されます。
#include <stdio.h>
int main() {
int score = 75;
char grade;
if (score >= 90) {
grade = 'S';
} else if (score >= 80) {
grade = 'A';
} else if (score >= 70) {
grade = 'B';
} else if (score >= 60) {
grade = 'C';
} else {
grade = 'D';
}
/* 75はscore>=70がTrueなので grade = 'B' */
printf("評価: %c\n", grade); /* B */
return 0;
}
else ifは条件を上から順に評価します。「score >= 90」「score >= 80」の順に書く場合、必ず大きい値の条件を先に書かなければなりません。もし「score >= 70」を先に書いてしまうと、70点以上の人は全員「B」と判定されてしまいます(score >= 90も70以上なので最初の条件で引っかかる)。
真 → grade = S
偽 → 次に進む
真 → grade = A
偽 → 次に進む
真 → grade = B
偽 → 次に進む
真 → grade = C
偽 → 次に進む
全て偽 → grade = D
最終フォールバック
04 LOGICAL OPS C C言語の論理演算子(&&・||・!)の使い方 複数の条件をAND・OR・NOTで組み合わせるC言語の記号表記
C言語の論理演算子はVBAの「And・Or・Not」と同じ概念ですが、&&(AND)・||(OR)・!(NOT)という記号で書く点が異なります。
📚 用語解説
C言語の論理演算子(&&・||・!):C言語で複数の条件を組み合わせる演算子。&&は「AかつB(両方が真のとき真)」、||は「AまたはB(少なくとも一方が真のとき真)」、!は「Aでない(真偽を反転)」を表す。VBAのAnd・Or・Notに対応する。C言語では短絡評価(ショートサーキット)が行われ、&&は左側が偽なら右側を評価しない、||は左側が真なら右側を評価しない。
#include <stdio.h>
int main() {
int age = 25;
int income = 5000000;
int hasJob = 1; /* 1 = true */
/* && (AND): 両方が真のときのみ真 */
if (age >= 20 && income >= 3000000) {
printf("ローン審査基準1を満たす\n");
}
/* || (OR): どちらか一方でも真なら真 */
if (income >= 5000000 || hasJob == 1) {
printf("ローン審査基準2を満たす\n");
}
/* ! (NOT): 真偽を反転 */
if (!hasJob) {
printf("無職です\n");
} else {
printf("就業中です\n"); /* hasJobが1(真)なので!hasJobは偽 → elseが実行 */
}
/* 複合条件(括弧で優先順位を明示) */
if ((age >= 20 && age <= 65) && (income >= 3000000 || hasJob == 1)) {
printf("審査通過\n");
}
return 0;
}
| 演算子 | C言語の記号 | VBAの対応 | 真になる条件 | 例 |
|---|---|---|---|---|
| AND(かつ) | && | And | 両方が真 | a >= 10 && b >= 5 |
| OR(または) | || | Or | 少なくとも一方が真 | a == 1 || b == 1 |
| NOT(否定) | ! | Not | 元の条件が偽 | !(a == 0) → aが0でない |
C言語の&&と||は短絡評価を行います。&&の場合、左側が偽なら右側は評価されません。これを利用して「if (ptr != NULL && ptr->value > 0)」のように書くと、ptrがNULLの場合に右側の評価(NULLポインタのデリファレンス)を防げます。安全なコードを書くためのテクニックとして覚えておきましょう。
05 COMPARISON OPS C C言語の比較演算子(==・!=・>・<)の使い方 6種類の比較演算子と「==と=を混同しないための注意点」
C言語のif文の条件式では6種類の比較演算子を使います。特に「等しい」の比較は=(代入)ではなく==(イコール2つ)を使う点がC言語での最重要ルールです。
📚 用語解説
比較演算子(==・!=・>・>=・<・<=):C言語で2つの値を比較する演算子。「==」(等しい)「!=」(等しくない)「>」(より大きい)「>=」(以上)「<」(より小さい)「<=」(以下)の6種類。最も間違えやすいのは「==」と「=」の混同。「=」はC言語では代入演算子なので「if (a = 5)」と書くと「aに5を代入→5は非ゼロなのでTrue」という意図しない動作になる。「等しいか比較する」には必ず「==」を使う。
| 演算子 | 意味 | 例 | 真になる条件 | 注意点 |
|---|---|---|---|---|
| == | 等しい | a == 5 | aが5のとき | =(代入)と混同しない!最重要ルール |
| != | 等しくない | a != 0 | aが0でないとき | 否定の比較 |
| > | より大きい | a > 10 | aが11以上 | 10は含まない |
| >= | 以上 | a >= 10 | aが10以上 | 10を含む |
| < | より小さい | a < 10 | aが9以下 | 10は含まない |
| <= | 以下 | a <= 10 | aが10以下 | 10を含む |
#include <stdio.h>
int main() {
int a = 5;
/* 正しい比較演算子の使い方 */
if (a == 5) { /* aが5と等しい? */
printf("aは5\n");
}
if (a != 10) { /* aが10と異なる? */
printf("aは10ではない\n");
}
if (a > 3 && a < 10) { /* aが3より大きく10未満? */
printf("aは3より大きく10未満\n");
}
/* よくあるミス: = を使ってしまう(バグ) */
/* if (a = 5) */ /* これは「aに5を代入」 → 5(非ゼロ)なので常にTrue */
/* if (a = 0) */ /* これは「aに0を代入」 → 0(ゼロ)なので常にFalse */
return 0;
}
「if (a = 5)」と書くと「aに5を代入した結果(=5)でif文を評価する(5は非ゼロなのでTrue)」という意味になり、常にTrue(aの値を5に書き換えながら)になります。コンパイルエラーにはならず実行できてしまうため、気づきにくいバグになります。定数と変数を比較する場合は「if (5 == a)」のように定数を左側に書く(Yoda記法)という慣習もあります。==の代わりに=を書いた場合、左側が定数ならコンパイルエラーになるため発見しやすくなります。
06 NESTED IF C if文のネスト(入れ子)と注意点 if文の中にif文を書くネスト構造の使い方と可読性を保つコツ
if文の中に別のif文を書く「ネスト(入れ子)」構造は、複数の条件を組み合わせた複雑な分岐を表現する際に使います。ただし、ネストが深くなると可読性が大幅に低下し、バグの原因になりやすいため注意が必要です。
#include <stdio.h>
int main() {
int age = 20;
int hasID = 1; /* 1 = 本人確認済み */
int isOver20 = (age >= 20); /* 1 = 20歳以上 */
/* ネストのif文 */
if (isOver20) {
if (hasID) {
printf("入場を許可します\n");
} else {
printf("本人確認書類が必要です\n");
}
} else {
printf("20歳未満は入場できません\n");
}
return 0;
}
上記のネスト例は&&演算子を使って1つのif文に書き直せます。
#include <stdio.h>
int main() {
int age = 20;
int hasID = 1;
/* &&を使ってネストを解消した版 */
if (age >= 20 && hasID) {
printf("入場を許可します\n");
} else if (age < 20) {
printf("20歳未満は入場できません\n");
} else {
printf("本人確認書類が必要です\n");
}
return 0;
}
if文のネストが3段階を超えると、どのelse/中括弧がどのifに対応するかを追うのが難しくなります。深いネストになったら、内部の処理を別の関数に切り出すことを検討してください。関数に分割することで、それぞれのロジックがシンプルになりテストもしやすくなります。
07 BRACE OMIT 括弧{}省略の危険性と避けるべき理由 if文の括弧省略がバグを生む有名な実例——Appleのバグから学ぶ
C言語では、if文の本体が1行だけの場合に中括弧{}を省略できます。しかし括弧の省略は予期しないバグの原因になりやすく、プロの現場では省略しないことが推奨されています。
/* 括弧を省略した書き方(動作する) */
if (score >= 80)
printf("合格\n"); /* ifの直後1文だけがif本体 */
/* 括弧を省略して後から行を追加した時のバグ */
if (score >= 80)
printf("合格\n");
printf("おめでとう\n"); /* これは常に実行される! ifに属さない */
/* 括弧を付けた安全な書き方 */
if (score >= 80) {
printf("合格\n");
printf("おめでとう\n"); /* 両方がifに属する */
}
2014年にAppleのSSL/TLSライブラリで「goto fail;」という1行が2度書かれたバグが発見されました。括弧{}なしのif文に行を追加した際の記述ミスが原因で、iPhoneのSSL認証が機能しないという重大なセキュリティ脆弱性が約1年間放置されていました。括弧省略がいかに危険かを示す実例として有名です。プロジェクトの多くで「if文には必ず{}を付ける」というコーディング規約が定められています。
「インデントが揃っているから大丈夫」という考えは誤りです。C言語(と多くの言語)はインデントで処理のスコープを判断しません。Pythonと違い、C言語では{}が処理ブロックを定義します。インデントはあくまで人間が読みやすくするための慣習であり、コンパイラは無視します。
08 IF VS SWITCH if文 vs switch文:使い分けの判断基準 同一変数の値を複数パターンで比較するならswitch文が読みやすい
C言語にはif-else if以外に「switch文」という多分岐構文があります。同一の変数を複数の定数値と比較する場合はswitch文の方がコードがすっきりします。
📚 用語解説
switch文(選択構造):C言語の制御構造の一つ。「switch(変数) { case 値1: 処理; break; case 値2: 処理; break; default: 処理; }」の形で使う。switch文は整数型や文字型(charはASCIIコードが整数のため可能)の比較に使える。注意点は各caseの末尾にbreakを書かないと次のcaseの処理も続けて実行される(フォールスルー)こと。breakの書き忘れは頻出バグ。
#include <stdio.h>
int main() {
int day = 3; /* 1=月〜7=日 */
/* if-else ifで書いた場合 */
if (day == 1) {
printf("月曜日\n");
} else if (day == 2) {
printf("火曜日\n");
} else if (day == 3) {
printf("水曜日\n"); /* これが実行される */
} /* ... 省略 */
/* switch文で書いた場合(同一変数の多値比較はこちらが読みやすい)*/
switch (day) {
case 1: printf("月曜日\n"); break;
case 2: printf("火曜日\n"); break;
case 3: printf("水曜日\n"); break; /* これが実行される */
case 4: printf("木曜日\n"); break;
case 5: printf("金曜日\n"); break;
case 6: printf("土曜日\n"); break;
case 7: printf("日曜日\n"); break;
default: printf("無効な値\n"); break;
}
return 0;
}
| 構文 | 向いているケース | switch文の制約 | 読みやすさ |
|---|---|---|---|
| if-else if | 異なる変数・複合条件・範囲比較(>=など) | なし | 複合条件に強い |
| switch文 | 同一変数を整数/文字の複数値と比較 | 整数・文字型のみ(浮動小数・文字列は不可) | 多値比較がすっきり読める |
09 TERNARY OP 三項演算子:if-elseの短縮記法 1行でif-elseを書ける三項演算子の使い方と注意点
📚 用語解説
三項演算子(条件演算子):C言語のif-elseを1行に書く演算子。「条件 ? 真の値 : 偽の値」の形で書く。「int max = (a > b) ? a : b;」はaとbのうち大きい方をmaxに代入する。式として書けるため、関数の引数や変数の初期化に直接書けるのが特徴。ネストすると可読性が大きく低下するため、シンプルな2分岐の値代入に限定して使うことが推奨される。
#include <stdio.h>
int main() {
int score = 75;
/* if-else を三項演算子で書く */
const char *result = (score >= 80) ? "合格" : "不合格";
printf("%s\n", result); /* 不合格 */
/* 三項演算子で最大値を求める */
int a = 10, b = 25;
int max = (a > b) ? a : b;
printf("最大値: %d\n", max); /* 25 */
/* 三項演算子のネスト(可読性が低いので避けるべき)*/
int x = 75;
const char *grade = (x >= 90) ? "S" : (x >= 80) ? "A" : (x >= 70) ? "B" : "C以下";
printf("評価: %s\n", grade); /* B */
return 0;
}
三項演算子はシンプルな2分岐には使えますが、ネストすると一行で読むのが非常に困難になります。3分岐以上の場合はif-else ifを使った方が読みやすいコードになります。「コードは書く時間より読む時間の方が長い」というプログラミングの格言のように、可読性を重視して三項演算子の使用は最小限にしましょう。
(a > b)のような
比較・論理式
? の後の値/式
を返す
: の後の値/式
を返す
または関数引数に
直接使用
10 CLAUDE CODE C IF Claude CodeでC言語のif文コードを自動生成する 条件分岐の要件を日本語で説明するだけでCコードが生成できる
C言語のif文は概念自体はシンプルですが、「==と=の混同」「括弧省略」「論理演算子の記号」など覚えることが多く、コードを書き慣れるまで時間がかかります。2026年現在、Claude Codeを使えばC言語のif文を含むコードを日本語で指示して自動生成できます。
| あなたの指示 | Claude Codeが生成するもの |
|---|---|
| 「整数を受け取って90以上はS、80以上はA、70以上はB、60以上はC、未満はDを表示するCプログラム」 | else if多段分岐 + printf のCコード(コンパイル可能) |
| 「入力した整数が素数かどうかを判定するCプログラム」 | 2から入力値-1まで割り切れるかチェックするif+ループのCコード |
| 「このCコードがなぜ常にTrueになるか教えて(if(a=5)のコードを貼り付け)」 | ==と=の混同の解説と修正済みコード |
| 「2つの整数を受け取り、大きい方を返す関数をCで書いて」 | 三項演算子または if-else を使った max 関数のCコード |
C言語の条件分岐もClaude Codeで効率的に学べます
「C言語のif文でバグが出て解決できない」「==と=の違いが分からなくなる」——こうしたC言語学習の課題はClaude Codeで解決できます。コードを見せるだけでバグの原因と修正方法を説明してくれます。
まずは無料相談で、C言語学習・プログラム開発の課題をヒアリングさせてください。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. C言語のif文の基本的な書き方を教えてください。
A. C言語のif文は「if (条件) { 処理; }」の形で書きます。条件が真(非ゼロ)の場合に中括弧{}内の処理が実行されます。2分岐の場合は「if (条件) { 処理A; } else { 処理B; }」、3つ以上の分岐は「if (条件1) { } else if (条件2) { } else { }」と書きます。必ず中括弧{}を付けることを強くお勧めします(省略可能ですが、バグの原因になりやすい)。
Q. C言語のif文で「等しい」を比較する演算子は何ですか?
A. 「等しい」を比較するには==(イコール2つ)を使います。=はC言語では代入演算子なので、「if (a = 5)」と書くと「aに5を代入した結果(=5)でif文を評価する」という意図しない動作になります。5は非ゼロなので常にTrueになるバグです。コンパイルエラーにはならないため非常に発見しにくいバグです。「等しい比較は==(2つ)」と覚えてください。
Q. C言語の「&&(AND)」と「||(OR)」の使い方を教えてください。
A. &&は「条件AかつB(両方が真のとき真)」、||は「条件AまたはB(少なくとも一方が真のとき真)」を表します。例:「if (age >= 20 && income >= 3000000)」は年齢が20以上かつ収入が300万以上の場合に真。「if (income >= 5000000 || hasJob == 1)」は収入が500万以上または就業中の場合に真。複数の演算子を組み合わせる場合は、括弧()で優先順位を明示することが重要です。
Q. C言語のif文で括弧{}を省略しても大丈夫ですか?
A. 構文上は省略可能ですが、省略しないことを強くお勧めします。括弧を省略した場合、後から行を追加すると「追加した行はifに属しない」というバグが起きやすくなります。2014年のApple iOS SSL/TLSの「goto fail;」バグは括弧省略が一因の有名なセキュリティバグです。ほとんどのプロジェクトのコーディング規約では「if文には必ず{}を付ける」とされています。
Q. C言語のif文とswitch文の使い分けを教えてください。
A. 同一の変数を複数の定数値(整数・文字)と比較する場合はswitch文の方がコードがすっきりします。異なる変数を比較する場合・&&/||を使った複合条件・範囲比較(>=など)の場合はif-else ifを使います。switch文は整数型・文字型にしか使えず、文字列や浮動小数点数の比較には使えません。
Q. C言語の三項演算子の使い方を教えてください。
A. 三項演算子は「条件 ? 真の値 : 偽の値」の形で使います。例:「int max = (a > b) ? a : b;」はaとbのどちらか大きい方をmaxに代入します。if-elseを1行に書ける省略記法ですが、ネストすると可読性が大幅に低下します。シンプルな2分岐の値の代入・返却に限定して使うことをお勧めします。
Q. Claude CodeでC言語のif文コードを生成できますか?
A. できます。「整数を受け取り90以上はS、80以上はA、70以上はBを表示するCプログラム」のように日本語で条件を説明するだけで、コンパイル可能なCコードが生成されます。バグのあるコードを貼り付けて「なぜ常にTrueになるのか」と質問することもでき、C言語学習の強力な支援ツールとして活用できます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




