C言語を学ぶ上で、プログラムの流れを制御するために欠かせないのが比較演算子です。

数値の大小を比べたり、値が等しいかどうかを判定したりするこの演算子は、条件分岐(if文)や繰り返し処理(for文、while文)の核となる要素です。

本記事では、C言語における比較演算子の種類から正しい使い方、さらには初心者が陥りやすい落とし穴まで、プロの視点で徹底的に解説します。

比較演算子とは?(基本概念)

C言語における比較演算子とは、2つの値を比較して、その結果を真(true)または偽(false)として返す記号のことです。

プログラミングにおける「判断」は、すべてこの比較に基づいています。

例えば、「ユーザーが入力した年齢が20歳以上か」や「ループの変数が10に達したか」といった判定はすべて比較演算子によって行われます。

C言語の特徴として、比較結果は数値として扱われる点に注意が必要です。

一般的に、真は「1」、偽は「0」という整数値で表現されます。

この仕組みを理解しておくことが、より高度な条件式の記述に役立ちます。

比較演算子の一覧と基本的な使い方

C言語で使用される比較演算子は、大きく分けて「等価演算子」と「関係演算子」の2つのカテゴリーに分類されます。

それぞれの記号と意味を以下の表にまとめました。

演算子意味使用例条件が真(1)になる場合
==等しいa == baとbが等しいとき
!=等しくないa != baとbが等しくないとき
<小なり(未満)a < baがbより小さいとき
>大なり(超える)a > baがbより大きいとき
<=以下a <= baがb以下(aがbと同じか小さい)とき
>=以上a >= baがb以上(aがbと同じか大きい)とき

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

等価演算子は、2つの値が同じであるか、あるいは異なっているかを判定するために使用します。

もっとも注意すべき点は、等しいことを示す演算子が == (イコール2つ)であることです。

数学のように = と書いてしまうと、C言語では代入演算子として解釈されてしまい、バグの原因となります。

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

関係演算子は、数値の大小を比較します。

特に「以上(>=)」や「以下(<=)」といった境界値を含む判定は、不等号とイコールの順序が決まっており、=>=< と記述するとコンパイルエラーになります。

必ず 不等号を先に書く ことを覚えておきましょう。

C言語における真偽値(0と1)の仕組み

C言語には、元々「論理型(bool型)」という独立した型が標準ではありませんでした(C99規格以降は stdbool.h をインクルードすることで使用可能です)。

そのため、伝統的なC言語の設計では、比較の結果を「整数」として処理します。

具体的には以下のルールに従います。

  • 0:偽(false)とみなす。
  • 0以外(主に1):真(true)とみなす。

比較演算子を実行した際、その式自体が 10 という値を持っていることを確認するためのプログラムを見てみましょう。

C言語
#include <stdio.h>

int main(void) {
    int a = 10;
    int b = 20;

    // 比較演算の結果をそのまま出力する
    printf("a = %d, b = %d\n", a, b);
    printf("a == b の結果: %d\n", a == b); // 偽なので0
    printf("a != b の結果: %d\n", a != b); // 真なので1
    printf("a < b の結果: %d\n", a < b);   // 真なので1
    printf("a > b の結果: %d\n", a > b);   // 偽なので0

    return 0;
}
実行結果
a = 10, b = 20
a == b の結果: 0
a != b の結果: 1
a < b の結果: 1
a > b の結果: 0

このように、比較演算子は計算式の一種であり、最終的に 01 という値を算出しているに過ぎないことがわかります。

条件分岐(if文)での実践的な活用方法

比較演算子が最も威力を発揮するのは if 文の中です。

ユーザーの入力値に応じて処理を切り替えるサンプルプログラムを作成します。

C言語
#include <stdio.h>

int main(void) {
    int score;

    printf("テストの点数を入力してください(0-100): ");
    scanf("%d", &score);

    // 比較演算子を使用した条件分岐
    if (score >= 80) {
        printf("素晴らしい!合格です。\n");
    } else if (score >= 60) {
        printf("合格ですが、復習も忘れずに。\n");
    } else {
        printf("不合格です。次は頑張りましょう。\n");
    }

    // 特定の数値と等しいかどうかの判定
    if (score == 100) {
        printf("満点おめでとうございます!\n");
    }

    return 0;
}

このプログラムでは、score >= 80 という比較式が評価され、もし入力された値が85であれば式全体が 1 (真)となり、中身の処理が実行されます。

比較演算子を使用する際の注意点

比較演算子は単純に見えますが、C言語特有の仕様によって意図しない挙動を引き起こすことがあります。

ここでは、特に間違いやすい3つのポイントを解説します。

代入演算子「=」との混同(よくあるミス)

初心者が最も頻繁に犯すミスが、if (a == 10) と書くべきところを if (a = 10) と書いてしまうことです。

C言語では代入式も「値」を持ちます。

a = 10 という式は、a10 を代入した上で、式全体の値として 10 を返します。

先ほど説明した通り、C言語では 0以外はすべて真 と判定されるため、if (a = 10) は常に真として処理されてしまいます。

これを防ぐためのテクニックとして、if (10 == a) のように定数を左側に書く「ヨーダ記法」と呼ばれる手法もあります。

この書き方であれば、万が一 10 = a と書き間違えた際にコンパイルエラーが発生するため、ミスを未然に防ぐことができます。

浮動小数点数(float, double)の比較

floatdouble といった浮動小数点数の比較に == を使うのは非常に危険です。

コンピュータ内部では小数は近似値として保持されており、計算過程で微小な誤差(丸め誤差)が発生するからです。

C言語
#include <stdio.h>

int main(void) {
    double x = 0.1 * 3.0;
    
    // 0.3と等しいか判定(期待通りにならない可能性がある)
    if (x == 0.3) {
        printf("等しい\n");
    } else {
        printf("等しくない(実際の値: %.20f)\n", x);
    }

    return 0;
}

実行結果(環境により異なります):

実行結果
等しくない(実際の値: 0.30000000000000004441)

浮動小数点数を比較する場合は、「2つの値の差が十分に小さいか」を判定するのが定石です。

C言語
#include <math.h>

// 差の絶対値が非常に小さければ等しいとみなす
if (fabs(x - 0.3) < 1e-9) {
    printf("ほぼ等しいとみなします\n");
}

文字の比較(ASCIIコード)

C言語では char 型の文字も比較演算子で比べることができます。

これは、内部的に各文字が ASCIIコード(整数値) として扱われているためです。

例えば、'A' < 'B' は真となります。

なぜなら、’A’の文字コードは65、’B’は66だからです。

これを利用して、「入力された文字が英大文字かどうか」を判定することができます。

C言語
char c = 'G';
if (c >= 'A' && c <= 'Z') {
    printf("%c は英大文字です。\n", c);
}

演算子の優先順位と結合規則

複雑な式を書く場合、演算子の優先順位を意識する必要があります。

比較演算子は、足し算や引き算などの算術演算子よりも 優先順位が低い です。

例えば、以下の式を見てみましょう。

if (a + b > c - d)

この場合、まず a + bc - d が計算され、その後にその結果同士が比較されます。

これは直感的な挙動ですが、等価演算子(==, !=)と関係演算子(<, >, <=, >=)の間でも優先順位の差があります。

  1. 算術演算子(+, -, *, /): 高い
  2. 関係演算子(<, <=, >, >=)
  3. 等価演算子(==, !=)
  4. 論理演算子(&&, ||): 低い

意図しない順序で評価されるのを防ぐため、また可読性を高めるために、少しでも複雑になる場合はカッコ ( ) を使って明示する ことが推奨されます。

複数の条件を組み合わせる(論理演算子との併用)

比較演算子単体では、「10以上かつ20以下」といった範囲の指定ができません。

これを実現するには、論理演算子(&&, ||, !)と組み合わせて使用します。

演算子名称意味
&&論理積(AND)AかつBが真のとき真
||論理和(OR)AまたはBが真のとき真
!論理否定(NOT)Aが偽のとき真

以下に、実践的な範囲判定の例を示します。

C言語
#include <stdio.h>

int main(void) {
    int age = 25;
    int has_ticket = 1; // 1は持っている(真)

    // 18歳以上 かつ チケットを持っている
    if (age >= 18 && has_ticket == 1) {
        printf("入場を許可します。\n");
    }

    // 年齢が6歳未満 または 65歳以上(割引対象など)
    if (age < 6 || age >= 65) {
        printf("特別料金が適用されます。\n");
    }

    return 0;
}

注意点として、数学で使うような 10 <= x <= 20 という記述はC言語では期待通りに動きません。

この書き方をすると、まず 10 <= x が評価されて 01 になり、その結果と 20 が比較されてしまうからです。

必ず (10 <= x) && (x <= 20) と分けて記述しましょう。

まとめ

C言語における比較演算子は、プログラムに知能(判断力)を与えるための最も基本的なツールです。

  • 基本の6種類(==, !=, <, >, <=, >=)を正しく使い分けること。
  • 比較結果は整数(1または0)として扱われる仕組みを理解すること。
  • 代入演算子 = と比較演算子 ==書き間違いに細心の注意を払うこと。
  • 浮動小数点数の比較には誤差の問題があるため、== を直接使わないこと。
  • 複数の条件を扱う際は、論理演算子(&&, ||)を適切に組み合わせること。

これらのポイントを押さえておくことで、バグの少ない、論理的で読みやすいコードを書くことができるようになります。

比較演算子は、単なる記号以上に、アルゴリズムを構築する上での重要な構成要素です。

日常的なコーディングを通じて、その挙動をしっかりとマスターしていきましょう。