トラック6・🔀制御構造

if文——もしも、の分かれ道

読む目安 約11分・ゴール:if文の書き方と条件式の考え方を理解し、条件によって処理を分けられるようになる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

朝、家を出る前に空を見ます。「雨が降っていたら、傘を持つ」。降っていなければ、何もしない。この「もしも〜なら」をそのままコードにしたのがif文です。

書き方はこうです。

if (条件式) {
    条件が真のときだけ実行される処理
}

かっこの中に書くのが条件式です。条件式の結果は「真」か「偽」のどちらかになります。C言語では 0 が偽、0以外はすべて真という約束で、C23ではbool型の true / false をそのまま書けます。

条件式でよく使う比較演算子は6つです。==(等しい)、!=(等しくない)、<(より小さい)、<=(以下)、>(より大きい)、>=(以上)。「以上・以下」は境界の値をふくみ、「より大きい・より小さい」はふくみません。80点を合格にしたいのか、81点からなのか——ここは日本語で声に出して確かめる癖をつけてください。境界の1点ぶんのズレは、テストで最も見つかりにくいバグのひとつです。

動く例を見ましょう。

#include <stdio.h>

int main(void) {
    int score = 85;

    if (score >= 80) {
        printf("合格です\n");
    }
    printf("判定おわり\n");
    return 0;
}

実行すると「合格です」「判定おわり」の2行が出ます。score を 70 に変えると「判定おわり」だけになります。if が支配しているのは { } の中だけで、その外は条件に関係なく必ず実行される——ここが最初の勘所です。

🧪 メモリの図解:この図はアプリ内で1行ずつ動かせます。アプリでこのトピックを開く

さて、罠の話です。実は { } は省略できます。省略すると、すぐ次の1文だけが if の対象になります。

#include <stdio.h>

int main(void) {
    int score = 70;

    if (score >= 80)
        printf("合格です\n");
        printf("おめでとう\n");   // if とは無関係。いつも実行される

    return 0;
}

70点なのに「おめでとう」が表示されます。インデントは揃っているのに、コンパイラはそれを見ていないからです。インデントは嘘をつきます。

もうひとつ。if (score >= 80); のように条件のうしろにセミコロンを打つと、そこで if は終わってしまいます。あとに続くブロックは条件と無関係に必ず実行され、しかもコンパイルは通ります。目で見つけるのが難しい部類の事故です。

師範波かっこを省いて得をしたことは、わしの知る限り一度もない。1文でも書け。それだけで夜眠れる

まとめます。if (条件式) { … } で、条件が真のときだけブロックを実行する。Cでは 0 が偽・0以外が真。そして { } は常に書く。この3つだけで、今日はもう十分です。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

80点以上を「合格」と表示したいプログラムです。空欄に入るものを選んでください。

if (score ____ 80) {
    printf("合格\n");
}
  1. >=
  2. >
  3. =>
  4. ==
答えを見る

正解:A(>=)

「80点以上」は80をふくむので >= です。> だと、ちょうど80点の人が不合格になってしまいます(境界の1点ぶんのズレは、テストで最も見つかりにくいバグのひとつ)。=> という演算子はC言語にありません(コンパイルエラー)。== では「ちょうど80点のときだけ合格」になります。

確認問題 2

次のプログラムを実行すると、何が表示されますか。

#include <stdio.h>

int main(void) {
    int stock = 3;

    if (stock > 0) {
        printf("在庫あり\n");
    }
    printf("確認おわり\n");
    return 0;
}
  1. 「在庫あり」「確認おわり」の2行
  2. 「確認おわり」の1行だけ
  3. 「在庫あり」の1行だけ
  4. 何も表示されない
答えを見る

正解:A(「在庫あり」「確認おわり」の2行)

stock は 3 なので stock > 0 は真になり、ifのブロックの中の「在庫あり」が表示されます。そのあとの「確認おわり」はifのブロックの外にあるので、条件に関係なく必ず実行されます。ifが支配しているのは { } の中だけ、というのがここでの要点です。

「制御構造」の目次

  1. 流れを変える——制御構造の全体像
  2. if文——もしも、の分かれ道
  3. else if / else の分かれ道設計
  4. 条件式の罠——= と == の悲劇
  5. 論理演算子と短絡評価
  6. switch文とfallthrough
  7. for文——回数が決まった繰り返し
  8. while文——条件が決める繰り返し
  9. do-while文と入力チェック
  10. breakとcontinueの使いどころ
  11. ループのネストと九九表
  12. 無限ループとの付き合い方

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版