C言語学習ポータル(無料版) 学習コンテンツ 制御構造 if文——もしも、の分かれ道

🔀 制御構造

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つだけで、今日はもう十分です。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

if文いふぶん

条件が真のときだけ、特定の処理を実行させる制御構造のこと。プログラムの中に「もしも」という分かれ道を作る、いちばん基本の道具。条件が偽のときは何もせず、そのまま次の処理へ進んでいく。

条件式じょうけんしき

真(true)か偽(false)のどちらかに評価される式のこと。if文やwhile文が「どちらへ進むか」を判断するための材料になる。true/falseで表される真偽値の型(bool)がこの評価結果にあたる。

bool型ぶーるがた

true(真)かfalse(偽)のどちらかしか入らない型のこと。C23では標準の書き方としてbool・true・falseがそのまま使えるようになった。従来は0と1で真偽を表していたが、C23の書き方の方が意図が伝わりやすい。

演算子えんざんし

+や-、==など、値どうしを計算したり比較したりするための記号のこと。演算子ごとに計算される優先順位があらかじめ決まっている。+ - * / のような算術演算子のほか、比較や論理の演算子も含まれる。

同じトラックのほかの項目

流れを変える——制御構造の全体像プログラムの流れが「順次・分岐・繰り返し」の3つでできていることを理解し、場面に応じてどれを使うか見当をつけられ… else if / else の分かれ道設計else / else if で複数の分かれ道を作れるようになり、範囲判定の順序を正しく設計できる 条件式の罠——= と == の悲劇代入 = と比較 == の違いを説明でき、条件式で取り違えたときに何が起きるかを見抜ける 論理演算子と短絡評価&& || ! で複数の条件を組み立てられるようになり、短絡評価の性質を安全のために利用できる switch文とfallthroughswitch文で値による多分岐を書けるようになり、break忘れによるフォールスルーを理解する for文——回数が決まった繰り返しfor文の3つの部品と実行順序を理解し、回数の決まった繰り返しを正しく書ける while文——条件が決める繰り返しwhile文で終わりの読めない繰り返しを書けるようになり、for との使い分けを判断できる do-while文と入力チェックdo-while の「まず1回は実行する」性質を理解し、入力のやり直しループを書ける breakとcontinueの使いどころbreak でループを打ち切り、continue で残りをスキップできるようになり、それぞれの副作用を避けられる ループのネストと九九表二重ループの動きを説明でき、九九表のような表形式の出力を自分で組み立てられる 無限ループとの付き合い方無限ループの原因を3つの型で診断でき、意図的な無限ループを出口つきで安全に書ける
‹ 流れを変える——制御構造の全体像 else if / else の分かれ道設計 ›

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

完全版(BOOTH)を見る

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

Web版 / BOOTH