🇯🇵 日本語 | 🇺🇸 English

第12回 条件分岐(if文)

C言語のif文の書き方。条件分岐をフローチャートで視覚的に理解。

📖 このページで覚えること
✅ 最低限ここだけ覚える
  • if (条件) { ... } の基本形
  • else で条件不成立時の処理
  • <> だけで条件を書いてみる
  • 条件は真なら実行、偽ならスキップ
⭐ 余裕があれば読む
  • else if で3つ以上に分ける
  • 波括弧 { } を省略しない理由
  • ネストした if と else の結びつき
🎬
この講座を動画で見る(約6分)
スライド解説 + 音声ナレーション

if文 ― 条件によって処理を変える

プログラムは基本「上から順に実行」されます。けれど、ある条件を満たすときだけ処理したい場面があります。そこで使うのが if 文です。
日常語で言うと「もしなら」。このページでは、比較演算子をまだ細かく覚えていない前提で、まず <> だけを使って if 文の形を理解します。
if (条件) {
  // 条件が真のときだけ実行
}
if文の処理の流れ。開始から条件判定に進み、条件が真なら処理を実行し、条件が偽ならスキップして、どちらも次の処理に合流する。

最初の具体例

int score = 75;
if (score > 59) {
    printf("合格\n");
}
score > 59 は「score が 59 より大きいなら」という意味です。score が 75 なら条件は真なので { } の中が実行されます。score が 50 なら条件は偽なので、中はスキップされます。
このページの方針: まずは <> だけで「条件が真なら入る、偽なら飛ばす」を理解します。等しい、以上、かつ・または、のような条件の書き方は、次の「比較・論理演算子」でまとめて扱います。

C言語の真偽 ― 0 以外はすべて真

C では、条件の結果を整数の値として扱います。0 だけが偽0 以外は真です。
0 以外の値
1, -1, 100 など
0 のみ
if (1) { // 常に真。必ず実行 }
if (0) { // 常に偽。実行されない }

波括弧 { } の役割

{ } は、複数の文を「if の中身」としてまとめるためのものです。中身が1行だけなら省略できますが、最初は常に書くのが安全です。
安全な書き方
if (x > 0) {
    printf("正の数\n");
    count++;
}
危ない書き方
if (x > 0)
    printf("正の数\n");
    count++;  // if の外。毎回実行
インデントで if の中に見えても、{ } がない if は直後の1文だけが中身です。

else ― 条件が偽のときの処理

else は「そうでなければ」を表します。if の条件が偽になったとき、else の中が実行されます。
int age = 16;
if (age > 17) {
    printf("成人です\n");
} else {
    printf("未成年です\n");
}
ポイント: 条件が真なら if 側、偽なら else 側。どちらか一方だけが実行されます。

else は省略できる

「条件が真のときだけ処理したい」場合は、else を書かなくても構いません。
if (errors > 0) {
    printf("エラーがあります\n");
}
// errors が 0 以下なら何も出さない

else if ― 3つ以上に分ける

if と else は2択です。3つ以上の場合分けをしたいときは、else if を上から順に並べます。
int score = 75;
if (score > 89) {
    printf("A\n");
} else if (score > 69) {
    printf("B\n");
} else if (score > 49) {
    printf("C\n");
} else {
    printf("D\n");
}
評価は上から順: 最初に真になった分岐だけが実行され、残りはスキップされます。
順番に注意: ゆるい条件を先に書くと、後ろの厳しい条件まで届きません。成績なら A の条件、B の条件、C の条件のように、上から順に狭い範囲を並べます。

成績判定デモ

判定
B
実行された分岐
else if (score > 69)

if文でよくある間違い

if 文では、文法は短いのに読み間違いやすいポイントがあります。比較演算子の細かい種類に入る前に、まず構造の罠を押さえます。
罠1条件の直後に ; を書いてしまう
if (score > 59);
{
    printf("合格\n");
}
条件の直後の ; で if は終わります。その後の { ... } は普通のブロックなので、score に関係なく実行されます。
罠2else がどの if に付くかを読み違える
if (a > 0)
    if (b > 0)
        printf("両方正\n");
else
    printf("b は正ではない\n");
C では else は一番近い if に結びつきます。迷わないように、ネストする場合は { } を必ず書きましょう。
罠3条件の順番をゆるい方から書く
if (score > 49) {
    printf("C\n");
} else if (score > 89) {
    printf("A\n");
}
95点でも最初の score > 49 が真になるので、A まで届きません。else if は上から順に判定される、という点を意識します。
罠4数式のように範囲を書いてしまう
int x = 100;
if (2 < x < 5) {
    printf("範囲内です\n");
}
数学では「2より大きく5より小さい」と読めますが、C言語ではそのまま範囲判定にはなりません。左から順に 2 < x を先に評価し、その結果の 0 または 1 をさらに < 5 と比べます。そのため、x が 100 でも真になってしまいます。範囲を表す条件の書き方は、次の「比較・論理演算子」で扱います。

ステップ実行 ― if文

if_demo.c

変数の状態

変数名

条件の評価

標準出力

 

自分で書いてみよう ― if文

my_if.c
出力
「実行」を押してください...
試してみよう

関連する講座

条件分岐編
第13回 比較・論理演算子
if 文の条件に書ける比較・論理演算子をまとめて学ぶ。
条件分岐編
第14回 確認問題(if)
C言語のif文の理解度を確認するクイズ。
条件分岐編
第15回 switch文
値で分岐する switch 文の使い方を解説。
← 前の講座
第11回 printfで変数を追う
次の講座 →
第13回 比較・論理演算子

確認クイズ

この講座の理解度をチェックしましょう。ここでは <> だけで解ける問題にしています。

Q1. if 文の条件が 0 のとき、どうなる?

ブロック内が実行される
ブロック内は実行されない
エラーになる

C言語では 0 は偽、0以外は真です。条件が 0 の場合、if ブロックは実行されません。

Q2. 次のコードの出力は?

int x = 5;
if (x > 0) {
    printf("A\n");
} else {
    printf("B\n");
}
A
B
何も出ない

5 > 0 は真なので、if 側の A が出力されます。

Q3. 次のコードの出力は?

int x = -2;
if (x > 0) {
    printf("正\n");
} else {
    printf("正ではない\n");
}
正ではない
コンパイルエラー

-2 > 0 は偽なので、else 側が実行されます。

Q4. 次のコードの出力は?

int score = 75;
if (score > 89) {
    printf("A\n");
} else if (score > 69) {
    printf("B\n");
} else {
    printf("C\n");
}
A
B
C

75 は 89 より大きくありませんが、69 より大きいので、B が出ます。

Q5. 条件をゆるい順に書くとどうなる?

int score = 95;
if (score > 49) {
    printf("C\n");
} else if (score > 89) {
    printf("A\n");
}
C
A
A と C

95 は最初の score > 49 を満たすので C が出て、後ろの else if は見られません。

Q6. 次のコードの出力は?

int score = 40;
if (score > 59);
{
    printf("合格\n");
}
何も出ない
合格
コンパイルエラー

if (score > 59);; で if は終わっています。その後のブロックは普通のブロックなので、条件に関係なく実行されます。

Q7. 次のコードで a=5, b=-3 のとき、出力は?

if (a > 0)
    if (b > 0)
        printf("両方正\n");
else
    printf("b は正ではない\n");
両方正
b は正ではない
何も出ない

else は一番近い if に結びつきます。外側の a > 0 は真、内側の b > 0 は偽なので、else 側が実行されます。

Q8. 複数行を if の中に入れたいとき、安全な書き方は?

インデントだけをそろえる
{ } で囲む
行頭に空白を2つ入れる

C言語ではインデントではなく { } がブロックを決めます。複数行を if の中に入れたいなら必ず囲みます。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。