C言語の基本|関係演算子の使い方

境界の値を含めるかどうかで、判定結果は変わる。関係演算子を正しく使って、意図した条件分岐を作ろう。

if文で条件分岐を作るときによく使うのが、2つの値の大小を比較する関係演算子です。

たとえば、次のような条件をC言語で表現できます。

  • 温度が0度未満なら注意する
  • 点数が60点以上なら合格にする
  • 在庫数が10個より少なければ発注する
  • 合格率が95%未満なら再検査する
  • 測定値が上限を超えたら警告する

関係演算子を使うと、変数の値と基準値を比較し、その結果を真または偽として得られます。if文は、その真偽によってブロック内を実行するか判断します。

ここで注意したいのが、<と<=、>と>=の違いです。

=が付いているかどうかによって、境界となる値を条件に含めるかが変わります。たった1文字の違いですが、プログラムの判定結果に直接影響します。

関係演算子とは

関係演算子は、2つの値の大小関係を比較する演算子です。

関係演算子意味条件式の例日本語での読み方
<より小さいtemperature < 0temperatureは0より小さい
<=以下temperature <= 0temperatureは0以下
>より大きいcount > 10countは10より大きい
>=以上score >= 60scoreは60以上

<と>は、境界値を含みません。

<=と>=は=が付いているため、境界値を含みます。

条件式境界値を含むか
n < 1010を含まない
n <= 1010を含む
n > 1010を含まない
n >= 1010を含む

条件式を作るときは、日本語の条件を正確に読み取ることが大切です。

より小さい、より大きいという表現なら境界値を含みません。以下、以上という表現なら境界値を含みます。

図1:4つの関係演算子と境界値の違い

この図から分かること

n < 10とn > 10では、境界値である10を条件に含みません。

n <= 10とn >= 10では、境界値の10も条件に含まれます。

数直線で考えると、どの範囲を条件に含めるのかが分かりやすくなります。特に境界値の位置を含むかどうかに注目すると、演算子を選びやすくなります。

関係演算子の結果は1または0になる

関係演算子を使った式は、比較結果に応じて1または0になります。

比較結果式の値ifでの扱い
条件が成立する1
条件が成立しない0

たとえば、nの値が8の場合を考えます。

条件式比較内容結果
n < 108は10より小さい1
n <= 88は8以下1
n > 108は10より大きい0
n >= 98は9以上0

if文では、条件式の結果が真ならブロック内を実行します。偽ならブロック内を飛ばし、その後ろの処理へ進みます。

if文と関係演算子の基本形

if文では、丸括弧の中に関係演算子を使った条件式を記述します。

if (変数 関係演算子 基準値) {
    条件が真の場合に実行する文;
}

たとえば、scoreが60以上の場合に合格と表示するなら、次のように記述します。

if (score >= 60) {
    printf("合格です。\n");
}

score >= 60が真なら、printfが実行されます。

scoreが60未満なら条件は偽になるため、ブロック内のprintfは実行されません。

条件式を日本語で読んでみる

関係演算子を正しく使うためには、条件式を日本語に置き換えて読む方法が役立ちます。

条件式日本語での読み方
value < 0valueは0より小さい
value <= 0valueは0以下
value > 100valueは100より大きい
value >= 100valueは100以上

条件式を見たときに、左側の値を主語として読むのがポイントです。

value < 0なら、valueは0より小さいと読みます。反対に読んでしまうと、条件の意味を取り違えることがあります。

関係演算子を使った条件分岐

ここでは、半導体チップの検査合格率を入力し、95%未満の場合だけ再検査のメッセージを表示します。

処理の流れは次のとおりです。

  1. 検査合格率を入力する
  2. 合格率が95%未満か判定する
  3. 95%未満なら再検査のメッセージを表示する
  4. 入力された合格率を表示する
  5. プログラムを終了する

図2:検査合格率が95%未満か判定する流れ

この図から分かること

pass_rate < 95は、pass_rateが95より小さいかを判定します。

94以下なら条件は真になり、再検査が必要と表示します。95以上なら条件は偽になり、再検査の表示を飛ばします。

<は境界値を含まないため、95は再検査の対象になりません。

関係演算子を使ったプログラム

検査合格率が95%未満なら再検査を通知するプログラム

ファイル名:8_2_1.c

#include <stdio.h>

int main(void)
{
    int pass_rate;

    printf("検査合格率を入力してください(%%)> ");
    scanf("%d", &pass_rate);

    /* 合格率が95%未満なら再検査を通知する */
    if (pass_rate < 95) {
        printf("警告: 基準未満のため再検査が必要です。\n");
    }

    printf("入力された検査合格率は%d%%です。\n", pass_rate);

    return 0;
}
実行結果の例

92を入力した場合は、95未満なので警告が表示されます。

検査合格率を入力してください(%)> 92
警告: 基準未満のため再検査が必要です。
入力された検査合格率は92%です。

95を入力した場合は、95未満ではないため警告は表示されません。

検査合格率を入力してください(%)> 95
入力された検査合格率は95%です。
プログラムの詳しい解説

pass_rateは、入力された検査合格率を保存するint型の変数です。

記述役割
int pass_rate;検査合格率を保存する変数を宣言する
scanf("%d", &pass_rate);入力された整数をpass_rateへ保存する
if (pass_rate < 95)合格率が95未満か判定する
printf("警告: 基準未満のため再検査が必要です。\n");条件が真の場合だけ警告を表示する
printf("入力された検査合格率は%d%%です。\n", pass_rate);条件の結果に関係なく合格率を表示する
return 0;main関数を正常終了する

pass_rateに92が保存されている場合、pass_rate < 95は真です。条件式の結果が1になるため、ifのブロック内が実行されます。

pass_rateに95が保存されている場合、pass_rate < 95は偽です。条件式の結果は0になり、ifのブロック内を飛ばします。

最後の合格率表示はifのブロックの外側にあります。そのため、条件が真でも偽でも実行されます。

pass_rate < 95を値ごとに確認する

pass_ratepass_rate < 95判定動作
921警告を表示する
941警告を表示する
950警告を表示しない
960警告を表示しない
1000警告を表示しない

境界値は95です。

条件式では<を使っているため、95は条件に含まれません。再検査の対象は95より小さい値です。

<と<=の違い

<は、右側の値より小さいことを判定します。<=は、右側の値以下であることを判定します。

条件949596意味
pass_rate < 9595より小さい
pass_rate <= 9595以下

pass_rate < 95では、95を条件に含みません。

pass_rate <= 95では、95も条件に含みます。

今回の基準が95%未満なら、<を使うのが正しい書き方です。

もし95%以下を再検査の対象にするなら、<=を使用します。

>と>=の違い

と>=も、境界値を含むかどうかが異なります。

たとえば、検査時間が60分を超えた場合に警告する条件を考えます。

条件596061意味
minutes > 6060より大きい
minutes >= 6060以上

60分を超えた場合なら、60そのものは含まれないため>を使います。

60分以上の場合なら、60も条件に含まれるため>=を使います。

境界値を先に決める

関係演算子を選ぶときは、最初に境界値とその扱いを決めます。

次の順番で考えると、条件式を作りやすくなります。

  1. 境界となる値を決める
  2. 境界値を条件に含めるか決める
  3. 境界より小さい側か大きい側か決める
  4. 条件に合う関係演算子を選ぶ
  5. 境界値の前後で判定結果を確認する

たとえば、合格点が60点の場合を考えます。

  • 境界値は60
  • 60点も合格に含める
  • 境界以上を合格にする
  • 使用する演算子は>=
  • 59、60、61で判定を確認する

条件式は次のようになります。

if (score >= 60) {
    printf("合格です。\n");
}
scorescore >= 60
59
60
61

境界値の前後を確認すると、演算子の選択ミスを発見しやすくなります。

図3:境界値を含む条件と含まない条件

この図から分かること

score > 60では、境界値の60を含みません。61以上の場合に真になります。

score >= 60では、60も条件に含みます。60以上の場合に真になります。

日本語の条件が60点以上なら>=を使い、60点を超えるなら>を使います。境界値を含めたい場合は、=が付いた関係演算子を選びます。

範囲を判定するときは条件を組み合わせる

1つの関係演算子では、片側の範囲しか表せません。

たとえば、検査合格率が0%以上100%以下であることを判定するには、2つの条件を&&で組み合わせます。

if (pass_rate >= 0 && pass_rate <= 100) {
    printf("入力された合格率は有効な範囲です。\n");
}

この条件には、次の2つが含まれています。

  • pass_rate >= 0
  • pass_rate <= 100

両方が真の場合だけ、全体の条件が真になります。

pass_rate0以上100以下全体の判定
-1
0
50
100
101

0以上100以下なので、境界値の0と100も有効な範囲に含まれます。

関係演算子の書き方に注意する

2文字で構成される関係演算子は、記号の順番と書き方が決まっています。

正しい記述誤った記述
<==<
>==>
<=< =
>=> =

以下は<=で表します。=<という演算子はありません。

以上は>=で表します。=>という演算子はありません。

また、<と=、>と=の間へ空白を入れてはいけません。2文字を続けて1つの演算子として記述します。

条件式の向きを確認する

次の2つは、左右を入れ替えても同じ範囲を表します。

条件式意味
n < 10nは10より小さい
10 > n10はnより大きい

どちらも同じ判定になりますが、変数を左側、基準値を右側に置くと読みやすくなることが多いです。

if (n < 10) {
    printf("nは10より小さい値です。\n");
}

条件式を書くときは、変数を主語として日本語で読める形にすると、演算子の向きを間違えにくくなります。

関係演算子を使うときの確認ポイント

  • 日本語の条件が未満、以下、超える、以上のどれか確認する
  • 境界となる値を決める
  • 境界値を条件に含めるか確認する
  • <と<=を使い分ける
  • と>=を使い分ける
  • <=や>=を1つの演算子として続けて記述する
  • =<や=>と書いていないか確認する
  • 境界値の1つ前、境界値、1つ後で結果を確認する
  • 条件式を変数は基準値より小さいのように日本語で読む

関係演算子による不具合は、境界値で発生しやすいのが特徴です。条件式を作ったら、通常の値だけでなく、境界値そのものを使って動作を確認することが大切です。