Java入門|演算子の優先順位

演算子の優先順位がわかると、Javaの式は「なんとなく読む」から「正しく読み解く」へ変わります。

Javaで式を書くとき、演算子が1つだけなら、それほど迷うことはありません。たとえば 3 + 2 や 4 * 5 のような式なら、どのように計算されるかすぐにわかりますよね。けれども、複数の演算子がひとつの式の中に並ぶと、「どこから先に計算されるのだろう」と気になることがあります。

ここで大切になるのが、演算子の優先順位です。Javaでは、演算子ごとに「どの演算を先に行うか」という順番が決まっています。このルールを知らずに式を書くと、自分が思っていた結果と違う値になってしまうことがあります。反対に、このルールを理解しておくと、複雑に見える式でも落ち着いて意味を読み取れるようになります。

また、Javaでは優先順位が決まっているだけでなく、丸かっこを使って評価の順番を変えることもできます。これは数学の式と同じ考え方ですね。さらに、同じ優先順位の演算子が並んだときには、左から処理するものと右から処理するものがあります。ここまでわかるようになると、式の見え方がかなり変わってきます。

ここでは、演算子の優先順位の基本から始めて、丸かっこで順番を変える考え方、左結合と右結合の違い、そして実際に間違いやすい例まで、丁寧に見ていきましょう。

演算子の優先順位とは

まず、次の式を見てみましょう。

a + 2 * 5

この式には、+ と * の2つの演算子があります。では、どちらが先に評価されるのでしょうか。

通常の四則演算では、足し算より掛け算を先に計算します。Javaでも同じで、掛け算のほうが足し算より優先順位が高いため、まず 2 * 5 が評価され、そのあとで a + 10 が評価されます。

つまり、次のような順番です。

  1. 2 * 5 を計算する
  2. その結果を a に足す

これは、数学の式と同じ感覚で考えて大丈夫です。

丸かっこを使うと優先順位を変えられる

演算子の優先順位はJavaであらかじめ決まっていますが、丸かっこを使うことで、評価の順番を変えることができます。

たとえば、次の式を見てください。

(a + 2) * 5

この場合は、丸かっこの中が先に評価されます。つまり、まず a + 2 を計算し、そのあとでその結果に 5 を掛けます。

さきほどの式と比べると、同じ記号を使っていても意味が変わりますね。

表にすると違いが見やすくなります。

先に計算される部分評価の流れ
a + 2 * 52 * 5a + 10
(a + 2) * 5a + 2その結果 × 5

このように、丸かっこは「ここを先に計算したい」とはっきり示すためのものです。Javaの式ではとても大切な役割を持っています。

代入演算子は優先順位が低い

四則演算だけでなく、代入演算子を含む式ではどうなるのでしょうか。たとえば、次の式を見てみましょう。

a = b + 2;

この式では、まず b + 2 が評価され、そのあとでその結果が a に代入されます。

つまり、意味としては次のように考えられます。

a = (b + 2);

これは、代入演算子 = の優先順位が、四則演算子より低いからです。

このルールを知らなくても何となく使えてしまうことは多いのですが、きちんと理解しておくと、式の読み方がぐっと安定します。

よく使う演算子の優先順位を整理しよう

Javaにはたくさんの演算子がありますが、最初のうちは全部を暗記する必要はありません。まずは、よく使うものの順番を大まかにつかむことが大切です。

代表的なものを優先順位の高い順に並べると、次のようになります。

優先順位演算子内容結合規則
高い()丸かっこ、引数、キャストなど左または右
++, --前置・後置インクリメント、デクリメント前置は右、後置は左
*, /, %乗算、除算、剰余
+, -加算、減算、文字列連結
<<, >>, >>>シフト演算子
>, >=, <, <=, instanceof比較、型比較
==, !=等価、非等価
&ビット論理積
^ビット排他的論理和
|ビット論理和
&&論理積
||論理和
?:条件演算子
低い=, +=, -= など代入、複合代入

この表を見ると、四則演算より代入のほうが後になることや、加算より乗算のほうが先になることがわかります。

この図では、3 + 2 * 5 という式の中で、先に 2 * 5 が評価されて 10 になることを示しています。そのあとで 3 + 10 が計算され、最終的な結果が 13 になります。

このように、式は左からただ順番に計算されるとは限りません。演算子ごとの優先順位に従って評価されるという点が大切です。

同じ優先順位の演算子はどうなるのか

ここでひとつ気になるのが、同じ優先順位の演算子が並んだときはどうなるのかということです。

たとえば、

a + b + 1

という式では、+ 演算子が2つ使われています。どちらも同じ優先順位ですね。この場合、Javaでは 左から順に評価されます。

つまり、

(a + b) + 1

という順番で処理されます。

このように、同じ優先順位の演算子が左から評価される性質を、左結合といいます。

左結合とは

左結合の考え方を表で整理すると、次のようになります。

評価の順番
a + b + 1(a + b) + 1
10 - 3 - 2(10 - 3) - 2
20 / 5 / 2(20 / 5) / 2

たとえば、

10 - 3 - 2

は、左から計算されるので、

  1. 10 - 3 = 7
  2. 7 - 2 = 5

となります。

もし右から計算すると結果が変わることもあるので、このルールはとても重要です。

右結合とは

一方で、すべての演算子が左結合というわけではありません。右から評価される演算子もあります。これを 右結合 といいます。

代表例は、代入演算子です。

たとえば、

a = b = 1;

という式は、左からではなく右から評価されます。つまり、

a = (b = 1);

という順番になります。

まず b に 1 が代入され、その結果として b = 1 の値が 1 になり、その 1 がさらに a に代入されます。結果として、a も b も 1 になります。

表にするとこうなります。

評価の順番結果
a = b = 1a = (b = 1)a も b も 1
a += b += 2a += (b += 2)右側から更新される

一般的に、単項演算子や代入演算子は右結合のものが多いです。

丸かっこを使わないとどうなるか

ここで、実際に優先順位に注意しないとどうなるのかを見てみましょう。元の例では、式の計算部分を丸かっこで囲っていました。では、丸かっこを付けないとどうなるのでしょうか。

ファイル名:Sample7.java

class Sample7
{
    public static void main(String[] args)
    {
        // 丸かっこを付けないで出力する
        System.out.println("4+5の結果は " + 4 + 5 + " です。");
        System.out.println("2*6の結果は " + 2 * 6 + " です。");
    }
}

実行結果を確認しよう

このプログラムを実行すると、次のようになります。

4+5の結果は 45 です。
2*6の結果は 12 です。

2つ目の掛け算は正しく 12 になっていますが、1つ目の足し算は 9 ではなく 45 になってしまいました。

ここがとても大切なポイントです。

なぜ 4+5 が 45 になるのか

次の式を見てみましょう。

"4+5の結果は " + 4 + 5 + " です。"

この式では、+ 演算子が文字列連結として働きます。しかも + は左結合なので、左から順に処理されます。

順番に追うと、次のようになります。

  1. "4+5の結果は " + 4
    → "4+5の結果は 4"
  2. "4+5の結果は 4" + 5
    → "4+5の結果は 45"
  3. "4+5の結果は 45" + " です。"
    → "4+5の結果は 45 です。"

つまり、数値の 4 と 5 を足しているのではなく、文字列として順番につないでいるのです。

なぜ 2*6 は正しく計算されるのか

一方で、こちらはどうでしょうか。

"2*6の結果は " + 2 * 6 + " です。"

この式では、* 演算子のほうが + より優先順位が高いため、先に 2 * 6 が計算されます。

つまり、まず 12 が求められ、そのあとで文字列と連結されます。

評価の流れはこうです。

  1. 2 * 6
    → 12
  2. "2*6の結果は " + 12 + " です。"
    → "2*6の結果は 12 です。"

このように、優先順位の違いによって、丸かっこがなくても正しく見える場合と、そうでない場合があるのです。

計算部分には丸かっこを付けるのが安心

こうした混乱を防ぐために、計算部分には丸かっこを付けるのが安心です。

たとえば、

System.out.println("4+5の結果は " + (4 + 5) + " です。");

と書けば、丸かっこの中が先に計算されるので、結果は正しく 9 になります。

同じように、

System.out.println("2*6の結果は " + (2 * 6) + " です。");

としておけば、処理の順番が読みやすくなります。

たとえ * のように優先順位が高くて丸かっこがなくても動く場合でも、読みやすさのために計算部分を丸かっこで囲むのはよい習慣です。

この図の左側では、丸かっこがないために、+ が左から文字列連結として処理され、45 という文字列になってしまうことを示しています。右側では、丸かっこの中の 4 + 5 が先に計算されるため、正しく 9 が表示されます。

この違いを見ると、丸かっこが単なる飾りではなく、式の意味を正しく伝えるための大切な道具だとよくわかります。

覚えておきたいポイント

演算子の優先順位を学ぶときは、次のポイントを押さえておくと理解しやすいです。

ポイント内容
演算子には優先順位があるどの演算を先に行うかが決まっている
掛け算や割り算は足し算より先数学と同じ感覚で考えられる
丸かっこで順番を変えられる丸かっこの中が優先される
同じ優先順位なら左結合が多いたとえば + や - は左から評価される
代入演算子は右結合a = b = 1 は右から評価される
文字列連結では特に注意丸かっこがないと意図しない結果になることがある

演算子の優先順位は、最初は少し細かく感じるかもしれません。でも、式を正しく読む力をつけるうえでとても大切です。特に、文字列連結と数値の計算が混ざる場面では、優先順位を意識するかどうかで結果が大きく変わります。

Javaの式を書くときは、機械任せにせず、「どこが先に評価されるのかな」と少し立ち止まって考えることが大切です。そして、迷ったときは丸かっこを使う。これを意識するだけでも、式の間違いはかなり減らせます。