C言語のきほん|条件を組み合わせる

条件が増えても怖くない!&& と || と ! を使い分けて、狙い通りに判定しよう。

if 文で分岐を作れるようになると、次に出てくるのが「条件が1つじゃ足りない問題」です。
たとえば、

  • 点数が 60 以上 かつ 100 以下なら合格
  • 入力が範囲外ならエラー(0未満 または 100より大)
  • 条件をひっくり返して「それ以外」を判定したい

みたいに、現実の判定はたいてい複数条件になります。

そこで使うのが 論理演算子 です。

  • &&(かつ)
  • ||(または)
  • !(否定)

この3つを押さえると、条件式が一気に表現しやすくなります。

条件を組み合わせる論理演算子

まずは意味を表で確認します。

演算子名前意味真になる条件
&&論理積A かつ BA も B も真
||論理和A または BA か B のどちらかが真(両方真でもOK)
!否定A ではないA が偽なら真、A が真なら偽

0以上100以下の範囲チェックは && が基本

文書の例は「0以上かつ100以下」です。考え方はこうです。

  • 0以上である(n >= 0)
  • 100以下である(n <= 100)
  • 両方満たす必要がある → &&

数直線でイメージ

サンプルプログラム

「年齢が 0〜120 の範囲内か」を判定するサンプルプログラムです。

ファイル名:8_3_1.c

#include <stdio.h>

int main(void)
{
    int age;

    printf("年齢を入力してください > ");
    scanf("%d", &age);

    /* 年齢が0以上かつ120以下なら妥当とみなす */
    if (age >= 0 && age <= 120) {
        printf("入力された年齢は範囲内です。\n");
    }

    return 0;
}

範囲内なら表示、範囲外なら何もしない、という動きです。

範囲外チェックは || が自然(0未満 または 上限超え)

範囲外は「条件が2つのどちらかに当てはまればアウト」です。

  • 0未満(n < 0)
  • 100より大(n > 100)
  • どちらかなら範囲外 → ||

数直線でイメージ(文字)

サンプルプログラム

今度は「年齢が範囲外なら警告」を出す形にします。

ファイル名:8_3_2.c

#include <stdio.h>

int main(void)
{
    int age;

    printf("年齢を入力してください > ");
    scanf("%d", &age);

    /* 0未満または120より大なら範囲外 */
    if (age < 0 || age > 120) {
        printf("範囲外の年齢が入力されました。\n");
    }

    return 0;
}

&& と || を間違えると、ほぼ全部OKになってしまう

範囲チェックでよくある事故がこれです。

  • 正しい:n >= 0 && n <= 100(0〜100の範囲)
  • 間違い:n >= 0 || n <= 100(ほぼ全部が真)

なぜ「ほぼ全部が真」になるかというと、

  • 200 のとき:n >= 0 が真 → 全体が真
  • -50 のとき:n <= 100 が真 → 全体が真

つまり、どんな数でも「どっちかはだいたい真」になりやすいので、全部通ってしまいます。

迷ったら、文書のアドバイス通り 数直線を描くのが一番確実です。

!(否定)で条件をひっくり返す

「範囲内」の条件があるなら、「範囲外」は否定でも書けます。

  • 範囲内:age >= 0 && age <= 120
  • 範囲外:!(age >= 0 && age <= 120)

サンプルプログラム(否定で書く)

ファイル名:8_3_3.c

#include <stdio.h>

int main(void)
{
    int age;

    printf("年齢を入力してください > ");
    scanf("%d", &age);

    /* 範囲内の条件を否定して、範囲外を判定する */
    if (!(age >= 0 && age <= 120)) {
        printf("範囲外の年齢が入力されました。\n");
    }

    return 0;
}

否定を使うとスッキリする場面もありますが、読みやすさは人によって変わるので「読みやすい方」を選ぶのがコツです。

実践問題:奇数判定

整数値を入力し、3で割り切れなければ「3の倍数ではありません。」と表示するプログラムを作成してください。
割り切れるかどうかは % を使って判定します。

実行例(割り切れない)

整数値を入力してください > 10
3の倍数ではありません。

実行例(割り切れる)

整数値を入力してください > 12
何も表示されません

解答例

ファイル名:8_3_4.c

#include <stdio.h>

int main(void)
{
    int n;

    printf("整数値を入力してください > ");
    scanf("%d", &n);

    /* 3で割った余りが0でなければ、3の倍数ではない */
    if (n % 3 != 0) {
        printf("3の倍数ではありません。\n");
    }

    return 0;
}

解説

  • n % 3 は「3で割った余り」です
  • 余りが 0 なら割り切れる(3の倍数)
  • 余りが 0 以外なら割り切れないのでメッセージを表示します

実践問題:範囲チェック

身長(cm)を整数で入力し、120以上200以下なら「入力は妥当です。」と表示するプログラムを作成してください。
複数条件の判定には && を使います。

実行例(範囲内)

身長(cm)を入力してください > 170
入力は妥当です。

実行例(範囲外)

身長(cm)を入力してください > 90
何も表示されません

解答例

ファイル名:8_3_5.c

#include <stdio.h>

int main(void)
{
    int h;

    printf("身長(cm)を入力してください > ");
    scanf("%d", &h);

    /* 120以上かつ200以下なら範囲内 */
    if (h >= 120 && h <= 200) {
        printf("入力は妥当です。\n");
    }

    return 0;
}

解説

範囲に入っているかは「下限を満たす」かつ「上限を満たす」の両方が必要なので && が自然です。

チャレンジ問題:三角形判定

3つの整数 a, b, c を入力し、それらが三角形の3辺になれるなら「三角形を作れます。」と表示してください。

条件

  • 3辺はすべて正の値
  • 任意の2辺の和が残りの1辺より大きい
    a + b > c かつ a + c > b かつ b + c > a

実行例(作れる)

3つの辺の長さを入力してください > 4 4 7
三角形を作れます。

実行例(作れない)

3つの辺の長さを入力してください > 1 2 3
何も表示されません

解答例

ファイル名:8_3_6.c

#include <stdio.h>

int main(void)
{
    int a, b, c;

    printf("3つの辺の長さを入力してください > ");
    scanf("%d %d %d", &a, &b, &c);

    /* まず正の値かチェックし、次に三角形条件をチェックする */
    if (a > 0 && b > 0 && c > 0 &&
        a + b > c && a + c > b && b + c > a) {
        printf("三角形を作れます。\n");
    }

    return 0;
}

解説

この問題は「条件の組み合わせ」の良い練習です。

  • まず a > 0 && b > 0 && c > 0 で「長さとして成立しているか」を確認
  • その上で、三角形の成立条件を && で全部つなぎます
    三角形はどれか1つでも条件を満たさないと成立しないので、&& が必要です