比較演算子

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

比較演算子 とは

値の大小・等しさを判定する比較演算子を学び、boolean を返す式を書けるようになろう。本レッスンでは、比較演算子 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

比較演算子とは

プログラムが「賢い」判断をするためには、まず 値同士を比べる 力が必要です。たとえば「年齢が 20 以上か」「点数が 60 未満か」「入力された名前と保存済みの名前が等しいか」のように、何かと何かを比べた結果に応じて処理を変える、というのが日常的なプログラミングの 8 割を占めています。

この「比べる」処理を担当するのが 比較演算子 (comparison operator) です。Java を含むほとんどの言語に同じ顔ぶれが揃っていて、結果は必ず truefalse という 2 値、すなわち boolean 型で返ってきます。

比較演算子の結果は必ず boolean です。int でも String でもなく、truefalse のどちらかしかありません。この性質が、後で学ぶ if 文や while 文の条件式と完璧にかみ合います。

6 つの比較演算子

Java で使える比較演算子は次の 6 つです。算数で習った記号とほとんど同じですが、いくつか独特の表記があります。

  • == — 等しい (equal to)
  • != — 等しくない (not equal to)
  • < — 左が右より小さい (less than)
  • > — 左が右より大きい (greater than)
  • <= — 左が右以下 (less than or equal to)
  • >= — 左が右以上 (greater than or equal to)

「以上・以下」を表す <= >=必ず不等号が先、= が後ろ という順番です。=<=> と書くとコンパイルエラーになるので注意してください。

Java

public class Demo { public static void main(String[] args) { int a = 5; int b = 3; System.out.println(a == b); // false System.out.println(a != b); // true System.out.println(a > b); // true System.out.println(a < b); // false System.out.println(a >= 5); // true System.out.println(a <= 4); // false } }

上の例では、すべての出力が truefalse のどちらかになっています。これが「比較演算の結果は boolean」という意味です。

=== は別物

初学者が 100% やらかすミス が、=== の取り違えです。記号は似ていますが、意味はまったく違います。

  • =代入演算子。右辺の値を左辺の変数に入れる (int a = 5;)
  • ==比較演算子。左右が等しいかを判定する (a == 5)

= は箱に物を入れる」「== は中身を見比べる」と覚えると混乱しません。a = 5 は「a に 5 を入れろ」という命令、a == 5 は「a の中身は 5 か?」という質問です。

たとえば次のコードは、見た目は正しそうでも意図と違う動きをします。

Java

int score = 80; if (score = 100) { // ← これはコンパイルエラー System.out.println("満点!"); }

Java では if の中に boolean 以外を入れられないので、上記のような = の書き間違いはコンパイル時点で弾かれます。これは Java の親切な仕様で、C 言語などでは同じミスが警告なしで通ってしまい大事故になります。

判定フローを図で見る

2 つの値 ab を比較したとき、ありえる結果は 3 通り しかありません。a == ba > ba < b です。図にすると次のようになります。

diagram (will load when visible)

この 3 分岐は 三分律 (trichotomy) と呼ばれる数学のルールで、実数 (および int long などの整数型) では必ずどれか 1 つだけが成り立ちます。逆に言うと、a == bfalse なら a > ba < b のどちらかが必ず true になります。

このレッスンの課題は、まさにこの三分律を 1 つの文字列にまとめて出力するものです。3 つの比較演算子 == > < の結果を順番に並べていきます。

文字列との連結

Java では + 演算子を使って文字列と他の値を 連結 できます。比較演算の結果 (boolean) を文字列と連結するとき、truefalse という文字列に自動的に変換されます。

Java

int a = 5; int b = 3; String message = "a == b: " + (a == b) + ", a > b: " + (a > b); System.out.println(message); // 出力: a == b: false, a > b: true

注意点は、(a == b) のように 比較式をカッコで囲む ことです。これを忘れると + の優先順位の関係で "a == b: " + a == b("a == b: " + a) == b と解釈され、String と int を で比較しようとするためコンパイルエラーになります。

よくある間違い

比較演算子は単純に見えて、初心者がつまずきポイントが大量にあります。代表的な 3 つを紹介します。

  • === の混同 — 上で説明した通り。if (a = 5) と書いてしまうと Java ではコンパイルエラー、他の言語では「代入してから true 判定」という別の動きになる罠です
  • 文字列を == で比較するString s1 = "hello"; String s2 = new String("hello"); s1 == s2 は意外にも false になります。文字列の中身を比べたいときは必ず s1.equals(s2) を使ってください。== はオブジェクトの「参照」が同じかを見るので、中身が同じでも別オブジェクトなら false です
  • 浮動小数の == 比較double x = 0.1 + 0.2; x == 0.3false です。double は内部で 2 進数表現するため、計算誤差が生じます。浮動小数を比べたいときは Math.abs(x - 0.3) < 1e-9 のように「許容誤差以内か」で判定するのが定石です

もうひとつ、Java でやってしまいがちなのが boolean 同士の < > 比較 です。true > false のような式は Java ではコンパイルエラーです。比較できるのは数値型 (int long double char 等) と、== != に限れば参照型 (String Integer 等) です。

エラーメッセージで bad operand types for binary operator '<' のような英語が出てきたら、たいてい比較できない型同士を比べようとしています。型を確認しましょう。

やってみよう

それでは右側のエディタで課題に挑戦しましょう。Solution.compare(int a, int b) メソッドは、ab を 3 つの比較演算子 == > < で比べて、結果を 1 行の文字列にまとめて返します。

書く手順は次の通りです。

  1. boolean eq = (a == b); のように 3 つの比較結果を変数に入れる (もちろん変数を使わず直接連結しても OK)
  2. "a == b: " + eq + ", a > b: " + gt + ", a < b: " + lt のように文字列を組み立てる
  3. 組み立てた文字列を return で返す

出力フォーマットは厳密で、a == b: の後ろに半角スペース、カンマの後ろに半角スペース、と決まっています。スペースの有無 1 文字でテストが fail するので、見本の文字列をよく見比べながら書いてください。

慣れてきたら、compare(0, 0) compare(-5, 5) compare(100, 99) のような値を自分で試して、どんな結果が返ってくるか手元で予想してから実行してみると、比較演算子の感覚がぐっと身につきます。これが if 文に発展する次のレッスンへの土台になります。

よくある質問

Q. 整数と小数を で比較できますか

A. できます。Java は int と double を で比較するとき、int を double に自動的に広げてから比較します。たとえば int a = 5; double b = 5.0; のとき a == btrue になります。ただし浮動小数点の演算誤差には注意が必要で、0.1 + 0.2 == 0.3false になります。本文の「浮動小数の 比較」の項も確認してください。

Q. char と int を で比較するとどうなりますか

A. char は Java では 0〜65535 の整数値として扱われるため、int と で比較できます。たとえば char c = 'A'; c == 65true です。文字コードを意識した比較をしたいときに便利ですが、読み手に伝わりにくいコードになるため、意図が明確でないときは避けた方が無難です。

Q. >= と => はどちらが正しいですか

A. Java では >=(不等号が先、= が後ろ)が正しい記法です。=> と書くとコンパイルエラーになります。「以上・以下は不等号を先に書く」と覚えてください。<=(以下)も同様に、=< は誤りです。

Q. 文字列の大小比較はどうなりますか?

A. ほとんどの言語で辞書順(文字コード順)に比較されます。'apple' < 'banana' は true、'10' < '9' は文字列としては true('1' < '9' のため)になるので、数値比較したいときは必ず Number()/int() で変換してから比較しましょう。

Q. 浮動小数点の比較で要注意な点は?

A. 0.1 + 0.2 == 0.3 は多くの言語で false になります。誤差を許容するため abs(a - b) < 1e-9 のように差の絶対値で比較するのが定石です。お金の計算は浮動小数を避け、整数(円単位の int)や Decimal 型を使ってください。

次のレッスン

次は 論理演算子 で、値の大小・等しさを判定する比較演算子を学び、boolean を返す式を書けるようになろう を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 比較演算子 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 比較演算子 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は compare、引数は int a, int b の 2 つにすること
  2. 戻り値の型は String で、フォーマットは "a == b: X, a > b: Y, a < b: Z" (X Y Ztruefalse)
  3. 比較演算子 == > < を使い、それぞれの結果を文字列に埋め込むこと

入出力例

test-cases.txt

compare(5, 3)"a == b: false, a > b: true, a < b: false" compare(2, 7)"a == b: false, a > b: false, a < b: true" compare(4, 4)"a == b: true, a > b: false, a < b: false" compare(-1, 0)"a == b: false, a > b: false, a < b: true"

ヒント

main.java
main.java
学習モード

メモ

比較演算子

⌘S で保存