Menu

Javaの演算子:算術・比較・論理・代入

Javaの演算子の仕組み(算術・比較・論理・代入・インクリメント・三項演算子)に加えて、整数除算・優先順位・初心者がはまりやすい落とし穴を解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

演算子の役割

演算子は、値を組み合わせて新しい値を計算するための記号です。+ で足し、> で比較するなど、すでに何気なく使っているはずです。Javaはこれらをいくつかの分類にまとめています。算術比較論理代入、そしてインクリメントや三項演算子といった特殊なものがいくつかあります。

ほとんどの演算子は2つの値(記号の前に1つ、後ろに1つ)を取り、結果を生み出します。コツは、その結果がどの型になるのか、そしてどの順序で適用されるのかを知ることです。ここで初心者はつまずきます。

算術演算子

5つの算術演算子は数値に対して働きます。+-*/%(剰余)です。

% 演算子は除算した後の余りです。17 % 52 になります。5が17に3回入って2が余るからです。割り切れるかを調べる日常的な道具であり、n % 2 == 0 は「n は偶数か?」を確かめる標準的な方法です。

また、+ は二役を担うことにも注意してください。数値では足し算をしますが、どちらかの側に String があるとテキストを連結します。

1行目は左から右へと読まれます。"Total: " + 3 はすでに文字列なので、4 はテキストとして追加されます。先に計算させたいときは、計算を括弧で囲みましょう。

整数除算の落とし穴

これは最もよくある驚きです。/両方のオペランドが整数のとき、Javaは整数除算を行い小数部分を捨てます。四捨五入はせず、ゼロの方向へ切り捨てます。

小数の結果を得るには、少なくとも一方のオペランドを double にします。.0 を付けて書くか、片側を (double) でキャストしてください。(double)(5 / 2)役に立ちません。整数除算 5 / 2 はキャストの前にすでに行われているからです。結果ではなく、オペランドをキャストする必要があります。

比較演算子

比較演算子はイエス/ノーの質問をして boolean を返します。6つあります。==!=<><=>= です。

=(代入 - 「この値をここに入れる」)と ==(比較 - 「これらは等しいか?」)の違いに注意してください。これらを取り違えるのは典型的なバグです。

重要な注意点があります。== はオブジェクトの参照を比較し、内容は比較しません。文字列には .equals() を使ってください。

intboolean のようなプリミティブには == を使い、String のようなオブジェクトの内容を比較するときは常に .equals() を使ってください。

論理演算子

論理演算子はブール値を組み合わせます。&&(かつ)、||(または)、!(否定)です。「十分な年齢でかつチケットを持っている」といった条件はこのように表現します。

&&||短絡評価を行います。答えが確定した時点でJavaは評価を止めます。&& では、左側が false なら右側は決して評価されません。|| では、左側が true なら右側はスキップされます。これは単なる最適化ではなく、安全のために頼ることができます。

if (text != null && text.length() > 0) { ... }

textnull の場合、左側が false になり text.length() は決して呼ばれないので、NullPointerException を避けられます。順序を逆にすると、クラッシュしてしまいます。

代入とインクリメント

= は代入しますが、Javaには演算と代入を組み合わせた複合代入もあります。+=-=*=/=%= です。そして ++ / -- は1を足したり引いたりします。

++ には2種類あります。後置count++)は古い値を返してからインクリメントし、前置++count)は先にインクリメントしてから新しい値を返します。この違いが問題になるのは、結果を同じ式の中で使うときだけです。

++ が単独の行にあるときは、後置と前置で違いはありません。ですから読みやすい方を選び、インクリメントを大きな式の中に詰め込まないようにしましょう。

三項演算子

三項演算子 condition ? a : b は、値を生み出すコンパクトな if/else です。条件が true なら a に、そうでなければ b に評価されます。

これは短いどちらか一方の代入で力を発揮します。三項演算子の中に三項演算子を入れ子にするのは避けましょう。すぐに読みづらくなり、普通の if/else の方が明快です。

優先順位と括弧

演算子は数学とよく似た決まった順序で適用されます。*/%+- より強く結びつき、それらは比較演算子より強く結びつき、比較演算子は && より強く、最後に || となります。

表全体を暗記する必要はありません。式が複数の分類をまたぐときや、順序を考えるために手が止まるときは、括弧を付けましょう。コストはゼロで、次に読む人に意図がはっきり伝わります。

次:型キャスト

ここで見た落とし穴のいくつか(整数除算、intdouble の混在)は、突き詰めると型の問題です。数値型の間で意図的に変換することをキャストと呼び、それが次のページのテーマです。

よくある質問

Javaの % 演算子は何をしますか?

% は剰余(モジュロ)演算子で、整数除算をした後に残る値を返します。7 % 3110 % 20 です。割り切れるかどうかを調べる標準的な方法であり(n % 2 == 0n が偶数であることを意味します)、値を一定の範囲に収めるのにも使います。

Javaで 5 / 2 が 2.5 ではなく 2 になるのはなぜですか?

両方のオペランドが整数の場合、/ は整数除算を行い小数部分を切り捨てるため、5 / 22.5 ではなく 2 になります。2.5 を得るには、少なくとも一方のオペランドを double にする必要があります。5.0 / 25 / 2.0 と書くか、(double) 5 / 2 のように片側をキャストしてください。

Javaにおける == と equals() の違いは何ですか?

== はプリミティブ型を値で比較しますが、オブジェクト(String を含む)の場合は参照を比較します。つまりメモリ上で同じオブジェクトかどうかを調べます。オブジェクトの内容を比較するには .equals() を使います。2つの文字列を == で比較すると、テキストが一致していても false を返すことがあるため、文字列には常に "a".equals(b) を使ってください。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める