C++の比較演算子とは、2つの値を比べて、その関係が正しいかどうかを判定するための演算子です。
たとえば、「2つの数値が等しいか」「ある値が別の値より大きいか」「点数が合格ライン以上か」といった条件を判断するときに使います。
比較演算子の結果は、基本的に真偽値で返されます。
つまり、条件が正しければ「真」、正しくなければ「偽」になります。
C++では、この真偽値を bool 型で扱います。
画面に出力する場合、設定によっては真が 1、偽が 0 と表示されることもあります。
C++で使う主な比較演算子
C++でよく使う比較演算子には、次の6種類があります。
等しいかを調べる演算子
2つの値が等しいかどうかを調べるときは、等価演算子を使います。
これは、「左側の値と右側の値が同じであれば真になる」という意味です。
たとえば、変数の値が特定の数値と一致しているか、入力された文字列が期待した内容と一致しているかを判定するときによく使います。
注意したいのは、C++では「等しいか」を調べる記号と、「値を代入する」記号が異なるという点です。
等しいかを調べる場合は比較、値を入れる場合は代入です。
この2つを間違えると、意図しない処理になることがあります。
等しくないかを調べる演算子
2つの値が異なるかどうかを調べるときは、「等しくない」という意味の比較演算子を使います。
この演算子は、左側と右側の値が違っていれば真になります。
反対に、同じ値であれば偽になります。
たとえば、ユーザーが入力した値が想定外であるかどうかを確認したり、現在の状態が特定の状態ではないことを判定したりするときに使います。
より小さいかを調べる演算子
ある値が別の値より小さいかどうかを調べるときに使います。
たとえば、年齢が18歳未満かどうか、点数が合格ラインに届いていないか、在庫数が一定数を下回っているかなどを判定できます。
「より小さい」という比較では、左右の値が等しい場合は偽になります。
より大きいかを調べる演算子
ある値が別の値より大きいかどうかを調べるときに使います。
たとえば、売上が目標を超えているか、入力された数値が上限を超えているか、ランキングのスコアが基準値を上回っているかなどを判断できます。
こちらも「より大きい」という比較なので、左右の値が等しい場合は偽になります。
以下かを調べる演算子
ある値が別の値以下かどうかを調べるときに使います。
「以下」には、値が小さい場合だけでなく、等しい場合も含まれます。
たとえば、年齢が12歳以下、価格が1,000円以下、点数が60点以下といった条件を判定するときに使います。
以上かを調べる演算子
ある値が別の値以上かどうかを調べるときに使います。
「以上」には、値が大きい場合だけでなく、等しい場合も含まれます。
たとえば、点数が80点以上なら合格、年齢が20歳以上なら対象、在庫数が1個以上なら購入可能といった条件を表せます。
比較演算子の結果は真または偽になる
比較演算子を使った式は、条件が正しいかどうかを判定します。
そのため、結果は「真」または「偽」のどちらかになります。
たとえば、10が20より小さいかを比べると、この条件は正しいため真になります。
反対に、10が20より大きいかを比べると、この条件は正しくないため偽になります。
この真偽値は、条件分岐や繰り返し処理でよく使われます。
if文と比較演算子
比較演算子は、特にif文と組み合わせて使われることが多いです。
条件が真なら処理を実行する
if文では、条件が真の場合にだけ特定の処理を実行できます。
たとえば、点数が80点以上なら「合格」と表示する、年齢が18歳未満なら「利用できません」と表示する、といった処理です。
比較演算子を使うことで、「どの条件を満たしたときに処理を行うか」を明確に指定できます。
条件が偽の場合の処理も書ける
if文では、条件を満たさなかった場合の処理も指定できます。
たとえば、点数が80点以上なら合格、それ以外なら不合格といった形です。
比較演算子は、こうした条件分岐の判断材料になります。
複数の条件を組み合わせる方法
比較演算子は、単独で使うだけでなく、複数の条件と組み合わせて使うこともできます。
そのときによく使うのが、論理演算子です。
かつを表す条件
複数の条件をすべて満たす必要がある場合は、「かつ」を表す論理演算子を使います。
たとえば、点数が80点以上かつ100点以下であるかを判定したい場合、2つの条件を組み合わせる必要があります。
このような書き方は、範囲判定でよく使います。
またはを表す条件
複数の条件のうち、どれか1つでも満たせばよい場合は、「または」を表す論理演算子を使います。
たとえば、年齢が18歳未満、または65歳以上なら割引対象にする、といった条件です。
この場合、どちらか一方の条件を満たしていれば全体として真になります。
否定を表す条件
ある条件を反転させたい場合は、否定を表す論理演算子を使います。
たとえば、「ログインしていない場合」「入力が完了していない場合」「条件を満たしていない場合」といった判定に使えます。
真を偽に、偽を真に変えるため、状態のチェックでよく使われます。
範囲判定で注意すべきこと
C++では、数学のような感覚で範囲判定を書くと、意図しない結果になることがあります。
数学のような連続した比較は避ける
数学では、「0以上100以下」のような条件を、1つの式で自然に表せます。
しかし、C++では同じように書いても、期待どおりの意味にはなりません。
C++では比較が左から順に評価されるため、最初の比較結果が真偽値になり、その真偽値がさらに次の値と比較されてしまいます。
その結果、本来は範囲外である値でも条件を満たしたように判定されることがあります。
範囲判定は条件を分けて書く
C++で範囲を判定したい場合は、下限の条件と上限の条件を分けて書き、それらを「かつ」でつなげる必要があります。
たとえば、「0以上であり、かつ100以下である」というように考えます。
この形で書けば、値が範囲内にあるかどうかを正しく判定できます。
代入と比較の違いに注意
C++初心者が特に間違えやすいのが、代入と比較の違いです。
比較は値が等しいかを調べる
比較は、2つの値が同じかどうかを調べるためのものです。
条件分岐の中で「この変数の値が10であるか」「入力された文字列が指定の文字列と同じか」といった判定に使います。
代入は値を入れる処理
代入は、変数に値を入れる処理です。
つまり、値が等しいかどうかを調べているのではなく、左側の変数に右側の値を入れています。
if文の条件式で誤って代入を使うと、比較したつもりなのに変数の値が書き換わってしまうことがあります。
代入式も条件として評価される
C++では、代入式も値を持ちます。
そのため、if文の条件部分に代入式を書いてしまうと、その代入結果が真または偽として評価されます。
たとえば、0以外の値を代入した場合は真として扱われ、0を代入した場合は偽として扱われます。
この性質により、比較のつもりで代入を書いてしまうと、バグの原因になります。
文字の比較
C++では、文字も比較できます。
char型の比較
文字を表すchar型は、内部的には数値として扱われます。
そのため、文字同士を等しいかどうかで比較したり、大小関係で比較したりできます。
たとえば、ある文字が特定の文字と同じかどうかを判定できます。
文字の大小比較は文字コードに依存する
文字の大小比較は、文字コードに基づいて行われます。
多くの環境では、アルファベットは一般的な順序で比較できるため、AよりBが大きいといった判定ができます。
ただし、これは文字コードに依存する考え方です。
特に日本語のような文字を自然な五十音順で比較したい場合、単純な比較演算子だけでは期待どおりにならないことがあります。
文字列の比較
C++で文字列を比較する場合は、どの種類の文字列を扱っているかに注意が必要です。
std::stringの比較
C++で文字列を扱う場合、一般的にはstd::stringを使います。
std::string同士であれば、比較演算子を使って文字列の内容を比較できます。
同じ文字列かどうかを調べたり、辞書式の順序でどちらが前に来るかを調べたりできます。
std::stringの大小比較は辞書式順序
std::stringの大小比較は、先頭の文字から順番に比較する辞書式順序で行われます。
たとえば、英単語同士であれば、辞書に近い順序で比較されるように見えます。
ただし、これは自然言語としての正確な辞書順や、日本語の五十音順を意味するわけではありません。
実際には、文字コードやエンコーディングに基づいて比較されます。
C文字列の比較には注意
C++では、C言語由来の文字列も使えます。
この形式の文字列は、文字列そのものではなく、文字列が置かれている場所を指すポインタとして扱われます。
そのため、比較演算子で比べると、文字列の内容ではなく、基本的にはアドレスを比較することになります。
見た目が同じ文字列であっても、別の場所に置かれていれば異なるものとして扱われる可能性があります。
逆に、同じ文字列リテラルが同じ場所にまとめられることもあるため、たまたま等しいと判定されることもあります。
しかし、それは文字列の内容を正しく比較できているという意味ではありません。
C文字列の内容を比較したい場合は、専用の関数を使うか、std::stringに変換して比較するのが安全です。
小数の比較
小数を比較するときは、整数の比較よりも注意が必要です。
小数は誤差が発生することがある
C++では、小数をfloat型やdouble型で扱います。
しかし、コンピュータは多くの小数を2進数で正確に表現できません。
そのため、人間の感覚では同じ値になるはずの計算でも、内部的にはわずかな誤差が発生することがあります。
たとえば、0.1と0.2を足した結果が、厳密には0.3と完全一致しないことがあります。
小数同士をそのまま等しいかで比較するのは危険
小数同士を完全一致で比較すると、計算誤差の影響で想定外の結果になる場合があります。
そのため、浮動小数点数では「完全に等しいか」ではなく、「十分に近いか」という考え方で比較することがあります。
許容誤差を使って比較する
小数を比較するときは、2つの値の差が十分に小さいかどうかを確認する方法がよく使われます。
このときに使う許容範囲を、一般的に誤差許容値と呼びます。
ただし、どの程度の誤差を許容するかは、扱う値の大きさや用途によって変わります。
非常に大きな数や非常に小さな数を扱う場合は、単純な固定値の誤差だけでは不十分なこともあります。
bool型の比較
bool型は、真または偽を表す型です。
bool型も比較できる
bool型の値同士も比較できます。
たとえば、2つの状態が同じかどうか、ある条件が真であるかどうかを比較できます。
bool型は直接条件に書くことが多い
ただし、bool型はそれ自体が真偽値なので、わざわざ「真と等しいか」と書かなくても、条件式としてそのまま使えます。
たとえば、「ログイン済みかどうか」を表す変数がある場合、その変数をそのままif文の条件に使う方が自然です。
反対に、「ログインしていない場合」を表したいときは、否定を使うのが一般的です。
初心者のうちは明示的に比較した方が理解しやすいこともありますが、慣れてくるとbool型はそのまま条件として使う書き方がよく使われます。
比較演算子の優先順位
C++の式では、演算子ごとに優先順位があります。
算術演算子は比較演算子より優先される
足し算や引き算などの算術演算子は、比較演算子よりも先に評価されます。
そのため、足し算の結果が別の値より大きいかを判定する場合、通常は足し算が先に行われ、その後に比較が行われます。
読みにくい式では括弧を使う
C++では、複数の演算子を1つの式にまとめることができます。
しかし、比較演算子を複数つなげたり、論理演算子と組み合わせたりすると、式が読みにくくなることがあります。
意図が分かりにくい式では、括弧を使って評価の順番を明確にすると安全です。
特に、比較結果をさらに別の値と比較するような書き方は、誤解やバグの原因になりやすいため避けた方がよいです。
関数の戻り値として比較結果を使う
比較演算子の結果は真偽値なので、関数の戻り値として使うこともできます。
条件判定を関数にまとめられる
たとえば、年齢が一定以上なら真を返す関数や、点数が合格点以上なら真を返す関数を作ることができます。
このように比較結果をそのまま返すことで、条件判定の処理を簡潔に書けます。
読みやすい関数名にすると分かりやすい
比較結果を返す関数は、名前の付け方も重要です。
たとえば、「成人かどうか」「有効な値かどうか」「範囲内かどうか」が分かる名前にすると、コード全体の意味が読み取りやすくなります。
自作クラスや構造体の比較
C++では、自分で作ったクラスや構造体にも比較の仕組みを定義できます。
そのままでは比較できない場合がある
整数や小数、std::stringなどは比較演算子が用意されています。
しかし、自分で作った構造体やクラスは、どのメンバを使って比較すればよいのかをC++が自動で判断できない場合があります。
そのため、必要に応じて比較演算子を自分で定義します。
比較の基準を自分で決められる
たとえば、座標を表す構造体であれば、x座標とy座標が両方同じなら等しいと判断できます。
商品を表すクラスであれば、商品IDが同じなら同じ商品と見なす、といった比較もできます。
このように、自作型の比較では「何をもって等しいとするか」を自分で決められます。
比較演算子は通常boolを返す
自作型の比較演算子は、通常はbool型を返すように定義します。
C++の文法上は別の型を返すことも可能ですが、一般的な使い方としては、比較の結果は真または偽で表すのが自然です。
C++20の三方比較演算子
C++20では、三方比較演算子が導入されました。
三方比較演算子とは
三方比較演算子は、2つの値の大小関係をまとめて判定するための演算子です。
これにより、「左の値が右の値より小さい」「等しい」「大きい」という3つの関係を1回の比較で表せます。
英語では、形が宇宙船に似ていることから、スペースシップ演算子と呼ばれることもあります。
自作型の比較を簡単に書ける
三方比較演算子は、自作クラスや構造体の比較を簡単に定義できる点でも便利です。
C++20以降では、メンバ変数を順番に比較するような処理を、より簡潔に書けるようになりました。
たとえば、座標を表す型であれば、まずx座標を比較し、x座標が等しければy座標を比較する、といった比較を自動的に定義できます。
C++20対応の環境が必要
三方比較演算子を使うには、C++20以降に対応したコンパイラや設定が必要です。
古いC++の規格でコンパイルしている場合は使えないため、学習や実務で使うときはコンパイル設定にも注意が必要です。
比較演算子でよくあるミス
比較演算子は便利ですが、初心者が間違えやすいポイントもいくつかあります。
比較と代入を間違える
最も多いミスの1つが、比較のつもりで代入を書いてしまうことです。
比較は「等しいかどうかを調べる」処理であり、代入は「値を入れる」処理です。
この2つを間違えると、条件判定が正しく行われないだけでなく、変数の値まで変わってしまいます。
範囲判定を数学のように書く
C++では、数学のように連続した比較を書いても、期待どおりの範囲判定にはなりません。
範囲を判定したい場合は、下限の条件と上限の条件を分け、それらを論理演算子でつなぐ必要があります。
小数を完全一致で比較する
小数には計算誤差が発生することがあります。
そのため、小数同士を完全に等しいかどうかで比較すると、思わぬ結果になる場合があります。
小数を比較するときは、用途に応じて許容誤差を考慮することが大切です。
C文字列を内容比較のつもりで比較する
C文字列を比較演算子で比べると、文字列の内容ではなくアドレスを比較してしまうことがあります。
文字列の中身を比較したい場合は、std::stringを使うか、C文字列用の比較方法を使う必要があります。
bool型を必要以上に比較する
bool型はそれ自体が真偽値です。
そのため、真かどうかを調べるために毎回明示的な比較を書く必要はありません。
読みやすさを考えると、bool型はそのまま条件式として使う方が自然な場合が多いです。
比較演算子を使う場面
比較演算子は、C++のさまざまな場面で使われます。
条件分岐
もっとも代表的なのは、if文による条件分岐です。
ユーザーの入力、点数、年齢、在庫数、設定値などを判定し、条件に応じて処理を変えるために使います。
繰り返し処理
比較演算子は、繰り返し処理の条件にも使われます。
たとえば、カウントが一定数未満の間だけ処理を続ける、特定の条件を満たすまでループする、といった使い方です。
入力チェック
ユーザーが入力した値が正しい範囲にあるか、空ではないか、指定された形式に合っているかなどを確認するときにも比較演算子を使います。
ゲームやアプリの状態判定
ゲームであれば、HPが0以下か、スコアが目標を超えたか、制限時間が残っているかなどを比較演算子で判定できます。
アプリケーションでも、ログイン状態、権限、設定値などの確認に使われます。
比較演算子を使うときの考え方
比較演算子を正しく使うには、「何と何を比べているのか」を明確にすることが大切です。
左辺と右辺の意味を意識する
比較演算子では、左側と右側に値や変数を置きます。
どちらが基準値で、どちらが調べたい値なのかを意識すると、条件式を読みやすくできます。
たとえば、「点数が80以上か」を判定したい場合は、点数を基準値と比較していることが分かるように書くと自然です。
条件を日本語に直して確認する
比較式を書いたら、一度日本語に直してみると間違いに気づきやすくなります。
たとえば、「年齢が18以上なら」「点数が60未満なら」「在庫数が0ではないなら」のように読めるかを確認します。
日本語にしたときに意味が不自然であれば、比較演算子の向きや条件の組み合わせが間違っている可能性があります。
複雑な条件は分けて考える
条件が複雑になると、比較演算子や論理演算子が増えて読みづらくなります。
そのような場合は、条件をいくつかに分けて考えると分かりやすくなります。
特に、範囲判定や複数条件の組み合わせでは、「下限を満たしているか」「上限を超えていないか」「特定の状態ではないか」といった形で分解すると、ミスを減らせます。
まとめ
C++の比較演算子は、2つの値を比べて、その関係が正しいかどうかを判定するための基本的な機能です。
等しい、等しくない、より小さい、より大きい、以下、以上といった比較を行うことで、条件分岐や繰り返し処理を実現できます。
特に重要なのは、比較と代入を混同しないことです。
比較は値が等しいかどうかを調べる処理であり、代入は変数に値を入れる処理です。
また、範囲判定では数学のような連続した比較は避け、条件を分けて論理演算子でつなぐ必要があります。
文字列の比較では、std::stringとC文字列の違いに注意が必要です。
std::stringは比較演算子で内容を比較できますが、C文字列ではアドレス比較になってしまうことがあります。
小数の比較では、計算誤差を考慮することも大切です。
整数のように単純な完全一致で比較すると、意図しない結果になる場合があります。
比較演算子はC++の基本でありながら、条件分岐、入力チェック、ループ処理、状態判定など、実務でも頻繁に使われます。
正しく理解しておくことで、読みやすく安全なコードを書きやすくなります。
以上、C++の比較演算子についてでした。
最後までお読みいただき、ありがとうございました。
