C言語のきほん|条件で分岐する

if は「条件が当たったときだけ動くスイッチ」!0 と 0以外の判定を押さえて、分岐の基本を身につけよう。

プログラムって、ただ上から順に処理するだけじゃなくて、「状況に応じて動きを変える」ことがとても多いです。
たとえば、

  • 入力が正しいときだけ計算する
  • パスワードが一致したらログインする
  • 在庫が足りないなら購入できない

みたいな判断ですね。こういう動きを 選択構造 と呼びます。

C言語では、選択構造を実現する代表として

  • 条件が真のときだけ実行する if
  • 値に応じて分岐先を切り替える switch

があります。この節ではまず、基本中の基本である if 文 をしっかり理解していきます。

if 文は「真のときだけ実行する」

if は、条件が成り立つときだけ処理を実行して、成り立たないときはその処理を飛ばして次へ進みます。

if 文の基本構文

if(条件式){
    文;
}

条件式が のときだけ、ブロック { } の中が実行されます。

条件式の判定ルール(0 と 0以外)

C言語の条件判定は、とても重要なルールがあります。

条件式の値判定
0偽(false)
0以外(1, -1, 100 など)真(true)

この「0以外は全部真」が最初は不思議に感じるけど、慣れるとすごく便利です。

そして実際は、次のような比較演算子を使って 1 か 0 を作ることが多いです。

  • ==, !=(等しい、等しくない)
  • <, <=, >, >=(大小)
  • &&, ||, !(条件の組み合わせ)

これらは結果として「真なら1、偽なら0」を作ってくれます。

ブロック { } と字下げ(読みやすさの基本)

if の中に書く処理が1行だけなら、{ } を省略できます。
ただ、初心者のうちは 1行でも { } を付けるのがとてもおすすめです。

理由は「読み間違いを防げる」からです。

例:字下げもセットで

字下げは動作には関係ないですが、読みやすさに直結します。
制御の流れが見えるように、if の中はインデント(字下げ)を付けます。

サンプルプログラム

「入力が負の値だったら注意メッセージを出す」プログラム例です。

ファイル名:8_1_1.c

#include <stdio.h>

int main(void)
{
    int temp;

    printf("気温を入力してください > ");
    scanf("%d", &temp);

    /* 0未満なら注意メッセージを出す */
    if (temp < 0) {
        printf("寒いので手袋があると安心です。\n");
    }

    printf("入力された気温は%dです。\n", temp);
    return 0;
}

このプログラムは、

  • temp が 0未満ならメッセージを表示
  • 0以上なら何も表示せず次へ

という動きになります。if は「当たったときだけ実行する」動きをきれいに表現できます。

条件式を読み解く(例:temp < 0)

if (temp < 0) の意味は、「temp が 0 より小さいなら真」です。
真になるとブロック内が実行されます。

入力temp < 0 の結果動作
-51(真)メッセージが出る
00(偽)メッセージは出ない
80(偽)メッセージは出ない

この「条件式が 1/0 を返す」という感覚がつかめると、分岐が一気に理解しやすくなります。

超重要注意:== と = を間違えない

これは if で一番やりがちなミスです。

  • == は比較(等しいか?)
  • = は代入(入れる)

しかも、= を書いてもコンパイルエラーにならないことがあるので厄介です。

間違い例のイメージ

たとえば「0かどうかを調べたい」つもりで、

if (n = 0)

と書くと、これは「n に 0 を代入する」になります。
そして代入式全体の値は 0 なので、条件は常に偽になり、if の中が一切実行されなくなります。

正しい書き方

if (n == 0)

です。

慣れるまでは、if の条件に = が見えたら「代入になってない?」と疑うクセをつけると安心です。