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

演算子の優先順位は、Javaの式における技の発動順。結合規則まで分かると、計算、代入、文字列連結の結果を迷わず読み解ける。

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

3 + 2

4 * 5

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

しかし、1つの式の中に複数の演算子が並ぶと、少し注意が必要になります。

3 + 2 * 5

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

左から順番に読むと、3 + 2 を先に計算したくなるかもしれません。

けれども、Javaでは * のほうが + より優先順位が高いため、先に 2 * 5 が評価されます。

つまり、次のように考えます。

3 + (2 * 5)

先に 2 * 5 が計算されて 10 になります。

そのあとで、3 + 10 が計算されます。

結果は 13 です。

先に評価される部分評価の流れ結果
3 + 2 * 52 * 53 + 1013
(3 + 2) * 53 + 25 * 525

このように、Javaの式は、ただ左から順番に処理されるわけではありません。

演算子には、どれを先に処理するかという 優先順位 があります。

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

これを 結合規則 といいます。

ドラゴンボール風にたとえるなら、演算子の優先順位は、複数の技が並んだときの 発動順 です。

* は強力な連撃技のように、+ より先に発動します。

丸かっこは、「この技を先に発動せよ」と明確に指示する司令官の合図です。

結合規則は、同じ強さの技が並んだときに、左側の戦士から連携するのか、右側の戦士から連携するのかを決めるルールです。

演算子の優先順位とは

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

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

a + 2 * 5

この式には、+ と * があります。

Javaでは、* は + より優先順位が高いです。

そのため、次のように評価されます。

a + (2 * 5)

まず、2 * 5 が評価されます。

2 * 5 = 10

そのあとで、a + 10 が評価されます。

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

ここで大切なのは、式が必ず左から順番に評価されるわけではないという点です。

Javaは、演算子ごとの優先順位に従って評価します。

ドラゴンボール風に言えば、+ は通常の気弾、* は強力な連撃技です。

戦いのルールとして、強力な連撃技である * が先に発動します。

そのため、3 + 2 * 5 では、3 + 2 よりも 2 * 5 が先に評価されます。

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

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

同じ 3、2、5、+、* を使っていても、丸かっこの有無で結果が変わります。

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

ドラゴンボール風にたとえるなら、丸かっこは 先行発動の結界 です。

通常なら * が先に発動します。

しかし、丸かっこで囲まれた部分は、特別な指示として最優先で発動します。

(3 + 2) * 5

この式では、3 + 2 が結界で囲まれているため、先に評価されます。

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

代入演算子 = は、優先順位が低い演算子です。

そのため、右辺の計算が先に行われ、その結果が左辺の変数に代入されます。

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

a = b + 2;

この式では、まず b + 2 が評価されます。

そのあとで、計算結果が a に代入されます。

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

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

ここでも大切なのは、= を数学の等号として読まないことです。

Javaの = は、右辺の結果を左辺に入れるための代入演算子です。

ドラゴンボール風に言えば、右辺は 技の威力を計算する場所 です。

左辺は 結果を記録する戦闘力カプセル です。

まず右辺で技の威力を計算し、その結果を左辺のカプセルに記録します。

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

Javaにはたくさんの演算子があります。

最初からすべてを暗記しようとしなくても大丈夫です。

ただし、よく使うものの順番は大まかに押さえておくと、式を読むときに迷いにくくなります。

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

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

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

この3つを押さえるだけでも、Javaの式はかなり読みやすくなります。

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

この図が示していること

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

式を左からそのまま処理すると、3 + 2 を先に計算したくなるかもしれません。

しかしJavaでは、* の優先順位が + より高いため、2 * 5 が先に評価されます。

まず 2 * 5 が 10 になり、そのあと 3 + 10 が評価されます。

その結果、最終的な値は 13 になります。

また、比較カードにある (3 + 2) * 5 では、丸かっこの中が先に評価されるため、結果は 25 になります。

このように、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)

この場合は、3 - 2 が 1 になり、10 - 1 で 9 になります。

同じ数字と演算子でも、評価の方向が変わると結果が変わります。

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

ドラゴンボール風にたとえるなら、左結合は 左側の戦士から順番に技をつなぐ連携 です。

技の強さが同じなら、左から順に発動します。

右結合とは

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

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

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

a = b = 1;

代入演算子 = は右結合です。

そのため、右側から評価されます。

a = (b = 1);

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

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

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

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

右結合は、左結合に比べると出てくる場面は限られます。

ただし、代入演算子を理解するときにはとても重要です。

ドラゴンボール風に言えば、右結合は 右側の戦士から順番に伝令が渡され、最後に左側へ結果が届く連携 です。

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

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

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

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

3 + 2 * 5

* のほうが + より優先順位が高いため、2 * 5 が先に評価されます。

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

10 - 3 - 2

- が2つあり、どちらも同じ優先順位です。

この場合は左結合なので、左から計算します。

(10 - 3) - 2

さらに、次の式では右結合が関係します。

a = b = 1;

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

a = (b = 1);

ドラゴンボール風に整理すると、次のようになります。

Javaの考え方ドラゴンボール風のイメージ
優先順位技の種類による発動順
結合規則同じ強さの技が並んだときの発動方向
丸かっこ先に発動する技を指定する結界

この違いを押さえると、複雑な式も整理して読めるようになります。

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

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

特に注意したいのが、文字列と数値を + でつなぐ場合です。

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の結果は 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) が丸かっこで囲まれています。

そのため、4 + 5 が先に計算され、結果は 9 になります。

そのあとで文字列と連結されるため、4+5の結果は 9 です。 と表示されます。

文字列と数値が混ざる式では、計算したい部分を丸かっこで囲むと、Javaにも読み手にも意図がはっきり伝わります。

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 になります。

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

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

書き方表示結果注意点
"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にも読み手にも、どこを先に計算したいのかがはっきり伝わります。

ドラゴンボール風にたとえるなら、丸かっこは 先に発動する技を指定する結界 です。

この結界を使うことで、文字列連結の流れに巻き込まれず、計算技を先に発動できます。

図:優先順位と結合規則を安全に読む流れ

この図が示していること

この図は、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の式でも、先に計算したい部分を丸かっこで囲むことで、評価の流れをはっきり伝えられます。

演算子の優先順位と結合規則が分かると、Javaの式はただの記号の並びではなく、どの技がどの順番で発動するのかが見える流れとして読めるようになります。