C言語のきほん|等価・関係・論理演算子

if の条件が読めるようになる近道!== と !=、大小比較、&& と || を“言葉で読める”ようにしよう。

C言語では「条件に合うときだけ処理する」「条件を満たす間だけ繰り返す」といった制御がとても大事になります。そこで中心になるのが、比較や条件の組み合わせを作るための 等価演算子・関係演算子・論理演算子 です。

たとえば、

  • 点数が 60 以上か?
  • 入力値が 0 ではないか?
  • 年齢が 20 以上 かつ 会員か?
  • どちらか一方でも条件を満たすか?

みたいな判断を、C言語では演算子で表現していきます。

そしてこの演算子たちの結果は、真なら1、偽なら0 になります(型としては int 扱い)。
「0 以外は真」も一緒に覚えておくと、条件式を読む力がグッと上がりますよ。

比較演算子は3つの仲間に分かれる

分類何をする?代表
等価演算子等しいか/等しくないか==, !=
関係演算子大小関係(大きい、小さい、以上、以下)>, >=, <, <=
論理演算子条件の組み合わせ(かつ/または/否定)&&,

どれも結果は「1か0」で返ってきます。

等価演算子(== と !=)

等価演算子は「同じかどうか」を判定します。

演算子意味例の読み方
==等しいa == ba と b は等しい?
!=等しくないa != ba と b は違う?

結果は 1 か 0

  • 等しければ 1
  • 等しくなければ 0

この 1 / 0 は int です。

よくあるミス:== と = を間違える

これは本当に多いです。しかもC言語は、間違ってもコンパイルエラーにならないことがあります。

if (number = 123) {  /* 代入になってしまう */
    ...
}

これが危ない理由は2つあります。

  • number に 123 が代入されてしまう(比較ではない)
  • C言語では 0 以外は真なので、123 は真扱いになり条件が通る

つまり「意図せず毎回true」みたいな状況が起きます。

慣れるまでは、条件式の中に = が見えたら「代入じゃない?」って一回立ち止まるクセを付けると安心です。

関係演算子(>, >=, <, <=)

関係演算子は「どっちが大きい?小さい?」を判定します。

演算子意味例の読み方
>より大きいa > ba は b より大きい?
>=以上a >= ba は b 以上?
<より小さいa < ba は b より小さい?
<=以下a <= ba は b 以下?

書き方の注意

  • => や =< は存在しません
  • = や < = のようにスペースを入れません(>= や <= が1つの演算子)

比較の結果を確認するプログラム

等価演算子と関係演算子の結果を確認するプログラムです。

ファイル名:6_7_1.c

#include <stdio.h>

int main(void)
{
    int now, target;

    printf("気温を2つ入力してください。\n");
    printf("現在の気温 > ");
    scanf("%d", &now);
    printf("基準の気温 > ");
    scanf("%d", &target);

    printf("\n[等価の結果]\n");
    printf("%d == %d : %d\n", now, target, now == target);
    printf("%d != %d : %d\n", now, target, now != target);

    printf("\n[大小の結果]\n");
    printf("%d >  %d : %d\n", now, target, now > target);
    printf("%d >= %d : %d\n", now, target, now >= target);
    printf("%d <  %d : %d\n", now, target, now < target);
    printf("%d <= %d : %d\n", now, target, now <= target);

    printf("\nメッセージ: 1は真、0は偽だよ。\n");

    return 0;
}

どう読み取る?

このプログラムは「比較式の結果」をそのまま数字で表示しています。
1 が出た行は「条件が成り立った」、0 が出た行は「成り立たなかった」ということです。

論理演算子(&&, ||, !)

論理演算子は「条件を組み合わせる」ために使います。if や while の条件で大活躍します。

演算子意味例の読み方
&&かつ(a > 0) && (b > 0)a も b も正なら真
または
!否定!aa が真なら偽、偽なら真

真偽の考え方(0以外は真)

C言語の条件判定では、次のルールが基本です。

条件での扱い
0
0以外(1, 2, -3 など)

なので、論理演算子は「式の結果が真か偽か」を使って判断します。

論理演算を確認するプログラム(別の例に置き換え)

「会員か」「年齢条件を満たすか」というプログラム例です。

ファイル名:6_7_2.c

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    bool is_member = true;   /* 会員ならtrue */
    bool is_adult  = false;  /* 20歳以上ならtrue(例としてfalseにする) */

    printf("[論理積(かつ)]\n");
    printf("会員かつ成人 : %d\n", is_member && is_adult);

    printf("\n[論理和(または)]\n");
    printf("会員または成人 : %d\n", is_member || is_adult);

    printf("\n[否定(でない)]\n");
    printf("会員ではない : %d\n", !is_member);

    printf("\nメッセージ: trueは1、falseは0として表示されるよ。\n");

    return 0;
}

bool は内部的には整数として扱えるので、printf では %d で出力できます(true が 1、false が 0 のように見えます)。

条件式を「日本語で読む」コツ

条件式は、記号のまま見るより「文章」に直すと理解しやすいです。

条件式日本語にすると
score >= 60点数が60以上
score < 0
(age >= 20) && is_member20歳以上で、会員でもある
!(a == b)a と b が等しい、ではない(つまり違う)

この「読み替え」ができるようになると、if の条件が怖くなくなります。

つまずきやすいポイント(やさしめ注意)

比較の結果は1か0だけど、条件では0以外が真

比較演算子は 1 か 0 を返します。
でも条件判定は「0以外は真」なので、比較以外の値でも真になります。

たとえば、

  • if (5) は真
  • if (-1) も真

「比較していないのに true になる」ことがあるので、慣れないうちは if の中は比較式を書く、と決めるのもアリです。

論理演算子は条件を“まとめる”のが仕事

&& や || は「条件を2つ以上つなぐ」ために使います。
そのとき、丸括弧を付けると読みやすさが上がります。

例:点数が合格範囲か

(score >= 0) && (score <= 100)

括弧がなくても動くことは多いですが、読みやすさのために付けるのはとても良い習慣です。