Java道|演算子の優先順位と結合規則

式は左から読むだけでは足りない。
優先順位と結合規則を知ると、Javaの計算結果を正しく読み解ける。

Javaで式を書くとき、演算子が1つだけならあまり迷いません。

3 + 2

4 * 5

このような式であれば、足し算や掛け算をそのまま考えればよいので、結果も分かりやすいです。

しかし、1つの式の中に複数の演算子が並ぶと、話が少し変わります。

3 + 2 * 5

この式では、+ と * が同時に出てきます。
このとき、Javaは左から順番に 3 + 2 を先に計算するわけではありません。掛け算のほうが足し算より優先順位が高いため、先に 2 * 5 を計算します。

この「どの演算を先に処理するか」というルールが、演算子の優先順位です。

さらに、同じ優先順位の演算子が並んだときには、左から処理するのか、右から処理するのかというルールもあります。これを結合規則といいます。

この記事では、指定内容に沿って Sample7.java のみを使い、演算子の優先順位、丸かっこの役割、左結合と右結合、そして文字列連結で起こりやすい間違いを、鬼滅の刃風の世界観にたとえながら整理します。

鬼滅の刃風にたとえると、演算子の優先順位は「どの技を先に発動するかを決める隊律」のようなものです。複数の技が同時に並んでいても、Javaの世界では発動順がきちんと決まっています。丸かっこは「この技を先に出す」と明確に指示する合図です。

演算子の優先順位とは

演算子の優先順位とは、複数の演算子が1つの式に出てきたとき、どの演算を先に行うかを決めるルールです。

たとえば、次の式を見てみます。

a + 2 * 5

この式には、+ と * が出てきます。

数学と同じように、Javaでも掛け算は足し算より先に計算されます。
そのため、この式は次のように評価されます。

a + (2 * 5)

まず 2 * 5 が計算され、結果は 10 になります。
そのあとで、a + 10 が計算されます。

先に計算される部分評価の流れ
a + 2 * 52 * 5a + 10
3 + 2 * 52 * 53 + 10 → 13

このように、式は単純に左から順番に処理されるとは限りません。
演算子ごとの優先順位に従って処理されます。

鬼滅の刃風にたとえると、+ は通常攻撃、* は強力な型のようなものです。強力な型には先に発動する決まりがあるため、Javaは * を先に処理します。

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

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

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

(a + 2) * 5

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

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

同じ + と * を使っていても、丸かっこの有無で計算結果が変わることがあります。

たとえば、a が 3 の場合で考えます。

評価結果
3 + 2 * 53 + 1013
(3 + 2) * 55 * 525

丸かっこは、Javaに対して「ここを先に計算してほしい」と伝えるための大切な道具です。

鬼滅の刃風にたとえると、丸かっこは「先にこの型を発動せよ」という指揮官の命令です。通常なら * が先に発動しますが、丸かっこで囲まれた部分は特別に先に処理されます。

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

代入演算子 = は、優先順位が低い演算子です。
そのため、右辺の計算が先に行われ、その結果が左辺の変数に代入されます。

たとえば、次の式を見てみます。

a = b + 2;

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

つまり、次のように考えると分かりやすいです。

a = (b + 2);
先に行われる処理最後に行われる処理
a = b + 2;b + 2 を計算する結果を a に代入する
total = price * count;price * count を計算する結果を total に代入する

ここで大切なのは、= は数学の「等しい」ではなく、右辺の結果を左辺に入れる処理だということです。

鬼滅の刃風にたとえると、右辺は「技の威力を計算する場所」、左辺は「結果を記録する巻物」です。まず技の威力を計算し、その結果を巻物に書き込む流れです。

よく使う演算子の優先順位

Javaにはたくさんの演算子があります。
最初からすべてを暗記する必要はありませんが、よく使うものの順番は大まかに押さえておくと安心です。

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

最初に特に意識したいのは、次の3つです。

覚えたいこと内容
*、/、% は +、- より先掛け算、割り算、あまりが先に評価される
= はかなり後右辺を計算してから代入する
丸かっこは最優先丸かっこの中を先に評価する

図:3 + 2 * 5 の評価順序

↓クリックすると拡大表示されます。

この図が示していること

この図では、3 + 2 * 5 の式がどの順番で評価されるかを示しています。

まず、+ より * の優先順位が高いため、2 * 5 が先に計算されます。
その結果が 10 になります。
次に、3 + 10 が計算され、最終的な結果は 13 になります。

ここから分かることは、Javaの式は左から単純に処理されるのではなく、演算子の優先順位に従って評価されるということです。

同じ優先順位の演算子が並んだ場合

演算子の優先順位が違う場合は、優先順位の高いものから処理されます。

では、同じ優先順位の演算子が並んだ場合はどうなるのでしょうか。

たとえば、次の式を見てみます。

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
2 * 3 * 4(2 * 3) * 4

たとえば、次の式を考えます。

10 - 3 - 2

- は左結合なので、左から評価されます。

(10 - 3) - 2

計算の流れは次のとおりです。

順番処理結果
110 - 37
27 - 25

結果は 5 です。

もし右から計算してしまうと、次のようになります。

10 - (3 - 2)

この場合は、10 - 1 なので 9 になります。
結果が変わってしまいます。

そのため、同じ優先順位の演算子が並んだときは、結合規則を意識することが大切です。

鬼滅の刃風にたとえると、左結合は「左側の隊士から順番に技をつなぐ連携」です。技の強さが同じなら、左から順に処理されます。

右結合とは

右結合とは、同じ優先順位の演算子が並んだとき、右側から評価するルールです。

代表的なものは、代入演算子です。

たとえば、次の式を見てみます。

a = b = 1;

代入演算子 = は右結合です。
そのため、右側から評価されます。

a = (b = 1);

処理の流れは次のようになります。

順番処理結果
1b = 1b に 1 が入る
2a = b = 1 の結果a に 1 が入る

最終的に、a も b も 1 になります。

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

右結合は、左結合に比べると出てくる場面は限られます。
ただし、代入演算子を理解するときにはとても重要です。

鬼滅の刃風にたとえると、右結合は「右側の隊士から順番に伝令が渡され、最後に左側へ結果が届く」ような流れです。

文字列連結と優先順位を確認する

ここからは、実際に間違いやすい例を見ていきます。

特に注意したいのが、文字列と数値を + でつなぐ場合です。
Javaでは、+ は数値の足し算にも使えますが、文字列と組み合わせると文字列連結として働きます。

ファイル名: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 です。

ここで注目したいのは、1つ目の結果です。

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

この式では、4 + 5 が計算されて 9 になるように見えるかもしれません。
しかし実際には、結果は 45 になります。

一方で、2つ目は 2 * 6 が正しく計算され、12 になります。

この違いは、+ の文字列連結、* の優先順位、+ の左結合が関係しています。

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

次の式を詳しく見てみます。

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

この式の先頭は文字列です。

"4+5の結果は "

この文字列に + 4 が続くと、Javaは数値の足し算ではなく、文字列連結として処理します。

さらに、+ は左結合です。
そのため、左から順番に連結されます。

順番評価される部分結果
1"4+5の結果は " + 4"4+5の結果は 4"
2"4+5の結果は 4" + 5"4+5の結果は 45"
3"4+5の結果は 45" + " です。""4+5の結果は 45 です。"

つまり、4 と 5 が数値として足されているのではありません。
文字列として順番につながっているため、45 になります。

鬼滅の刃風にたとえると、先頭に文字列という「札」があるため、その後の 4 と 5 も計算の技ではなく、札に文字をつなげる動きとして扱われます。

なぜ 2 * 6 は正しく 12 になるのか

次に、2つ目の式を見てみます。

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

この式にも文字列連結があります。
しかし、* は + より優先順位が高いです。

そのため、先に 2 * 6 が計算されます。

順番評価される部分結果
12 * 612
2"2*6の結果は " + 12"2*6の結果は 12"
3"2*6の結果は 12" + " です。""2*6の結果は 12 です。"

結果として、正しく 12 が表示されます。

ここで大切なのは、2 * 6 が正しく計算されたのは、たまたま * の優先順位が + より高かったからです。

式の意味を読みやすくするためには、計算部分を丸かっこで囲むほうが安心です。

計算部分には丸かっこを付けると分かりやすい

文字列連結と計算が混ざる場合は、計算したい部分を丸かっこで囲むと安全です。

たとえば、4 + 5 をきちんと計算したい場合は、次のように書きます。

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

この場合、丸かっこの中が先に評価されます。

(4 + 5)

結果は 9 です。
そのあとで文字列と連結されます。

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

そのため、表示結果は次のようになります。

4+5の結果は 9 です。

2 * 6 のように、丸かっこがなくても先に計算される場合もあります。

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

ただし、読みやすさを考えるなら、次のように書くほうが親切です。

System.out.println("2*6の結果は " + (2 * 6) + " です。");
書き方結果読みやすさ
"4+5の結果は " + 4 + 5 + " です。"45意図とずれやすい
"4+5の結果は " + (4 + 5) + " です。"9計算部分が明確
"2*6の結果は " + 2 * 6 + " です。"12動くが少し読みにくい
"2*6の結果は " + (2 * 6) + " です。"12計算部分が明確

Javaの式では、正しく動くことも大切ですが、あとから見て分かりやすいことも大切です。
迷いやすい場所には丸かっこを付けると、読みやすく安全なコードになります。

図:文字列連結で 45 になる場合と、丸かっこで 9 になる場合

↓クリックすると拡大表示されます。

この図が示していること

この図では、文字列連結と数値計算が混ざったときに、丸かっこの有無で結果が変わることを示しています。

左側では、丸かっこがないため、+ が左から文字列連結として処理されます。
その結果、4 と 5 は足し算されず、文字列としてつながり、45 と表示されます。

右側では、(4 + 5) が先に計算されます。
その結果、9 が求められ、そのあとで文字列と連結されます。

ここから分かることは、文字列と数値が混ざる式では、計算したい部分を丸かっこで囲むと意図がはっきりするということです。

Sample7.javaを丸かっこ付きにすると分かりやすい

Sample7.java の出力部分を、計算部分が分かりやすくなるように書くと、次のようになります。

ファイル名: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の結果は 9 です。
2*6の結果は 12 です。

このように、丸かっこを付けることで、4 + 5 が先に計算されることが明確になります。

2 * 6 は丸かっこがなくても 12 になります。
しかし、丸かっこを付けることで「ここは計算部分です」と読み手に伝わりやすくなります。

丸かっこの役割
(4 + 5)足し算を文字列連結より先に行う
(2 * 6)掛け算部分を計算として明示する

丸かっこは、Javaにとっての評価順を変える道具であり、人間にとっての読みやすさを高める道具でもあります。

文字列連結で注意したい + の働き

+ は、Javaでは2つの役割を持ちます。

使い方役割
数値 + 数値足し算
文字列 + 値文字列連結

たとえば、次の式は数値同士なので足し算です。

4 + 5

結果は 9 です。

一方、次の式は先頭が文字列です。

"結果は " + 4

この場合、+ は文字列連結として働きます。
結果は、文字列の "結果は 4" になります。

さらに、そこへ + 5 が続くと、次のようになります。

"結果は " + 4 + 5

+ は左結合なので、左から処理されます。

("結果は " + 4) + 5

結果は、"結果は 45" です。

もし 4 + 5 を先に計算したいなら、丸かっこを使います。

"結果は " + (4 + 5)

この場合は、結果は "結果は 9" になります。

優先順位と結合規則の違い

演算子の優先順位と結合規則は似ているように見えますが、役割が違います。

用語意味
優先順位どの種類の演算を先に行うか* は + より先
結合規則同じ優先順位の演算子をどちらから処理するか+ は左から、= は右から

たとえば、次の式では優先順位が関係します。

3 + 2 * 5

* のほうが + より優先順位が高いため、2 * 5 が先です。

一方、次の式では結合規則が関係します。

10 - 3 - 2

- が2つあり、どちらも同じ優先順位です。
この場合は左結合なので、左から計算します。

(10 - 3) - 2

そして、次の式では右結合が関係します。

a = b = 1;

= は右結合なので、右から評価します。

a = (b = 1);

優先順位は「技の種類による発動順」、結合規則は「同じ強さの技が並んだときの発動方向」と考えると分かりやすいです。

よくある間違いと安全な書き方

演算子の優先順位でよく起こる間違いは、文字列連結と数値計算が混ざる場面です。

書き方表示結果注意点
"4+5の結果は " + 4 + 54+5の結果は 454 と 5 が文字列として連結される
"4+5の結果は " + (4 + 5)4+5の結果は 94 + 5 が先に計算される
"2*6の結果は " + 2 * 62*6の結果は 12* が + より先に計算される
"2*6の結果は " + (2 * 6)2*6の結果は 12計算部分が明確になる

安全に書くなら、計算したい部分は丸かっこで囲みます。

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

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

このように書くと、Javaにも読み手にも、どこを先に計算したいのかがはっきり伝わります。

覚えておきたいポイント

演算子の優先順位と結合規則を学ぶときは、次のポイントを押さえると理解しやすくなります。

ポイント内容
演算子には優先順位があるどの演算を先に行うかが決まっている
掛け算や割り算は足し算より先3 + 2 * 5 は 13 になる
丸かっこで順番を変えられる(3 + 2) * 5 は 25 になる
同じ優先順位では結合規則を見る+ や - は左結合が多い
代入演算子は右結合a = b = 1 は右から評価される
文字列連結では特に注意"結果は " + 4 + 5 は 45 になりやすい
迷ったら丸かっこを使う意図が明確になり、読みやすくなる

演算子の優先順位は、細かいルールに見えるかもしれません。
しかし、Javaの式を正しく読むためにはとても大切です。

特に、文字列連結と数値計算が混ざる場面では、思った結果と違う表示になりやすいです。

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

このコードでは、4 + 5 が足し算されるのではなく、文字列として連結されて 45 になります。

一方で、次のように丸かっこを付ければ、意図どおり 9 が表示されます。

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

鬼滅の刃風にたとえると、丸かっこは「この型を先に発動する」という明確な合図です。
Javaの式でも、先に計算したい部分を丸かっこで囲むことで、評価の流れをはっきり伝えられます。