乗算と加算は結合的な 2 つの演算です。つまり、これら 2 つの演算子の左側と右側のオペランドは、結果に影響を与えることなく交換できます。演算子にはさまざまな優先順位があり、いわゆる優先順位は式の演算における演算の順序です。
一般に、単項演算子の優先順位が高く、代入演算子の優先順位が低くなります。算術演算子の優先順位は高く、関係演算子と論理演算子の優先順位は低くなります。ほとんどの演算子は左結合であり、単項演算子、三項演算子、代入演算子は右結合です。
Java 言語の演算子の優先順位は 14 レベルに分かれており、レベル 1 が最も高く、レベル 14 が最も低くなります。同じ式内で優先順位の高い演算子が最初に実行されます。表 1 に、すべての演算子の優先順位と結合性を示します。
優先順位 | オペレーター | 組み合わせ |
---|---|---|
1 | ()、[]、{} | 左から右へ |
2 | !、+、-、~、++、– | 左から右へ |
3 | *、/、% | 左から右へ |
4 | +、- | 左から右へ |
5 | «、»、>>> | 左から右へ |
6 | <、<=、>、>=、instanceof | 左から右へ |
7 | ==、!= | 左から右へ |
8 | & | 左から右へ |
9 | ^ | 左から右へ |
10 | | | 左から右へ |
11 | && | 左から右へ |
12 | || | 左から右へ |
13 | ?: | 左から右へ |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、«=、»=、>>>= | 左から右へ |
優先順位 1 のかっこは、他の演算子の優先順位を変更できます。つまり、優先順位の低い演算子を最初に操作する必要がある場合は、かっこを使用して演算子と演算子を囲むことができます。たとえば、次のような式です。
(x-y)*z/5
この式では、最初に括弧内の減算が実行され、次にその結果に z が掛けられ、最後にその積が 5 で除算されて結果が得られます。式全体の順序は左から右に実行されるため、理解しやすくなります。
以下に示すような複雑な式を見てみましょう。
--y || ++x && ++z;
この式には算術演算子と論理演算子が含まれます。表 1 にリストされている優先順位に従って、その実行順序は次のように決定できます。
① まず、y の自己減分演算子、つまり –y を計算します。
② 次に、x の自己インクリメント演算子、つまり ++x を計算します。
③ 次に、z の自己インクリメント演算子、つまり ++z を計算します。
④ 論理積は論理和よりも優先されるため、ここでは②と③の結果、つまり++x && ++zの論理積演算を行います。
⑤ 最後に、④と①の結果、つまり–y||++x&&++zの論理和演算を行います。
この式が実行される順序についての上記の説明がなければ、一見しただけでは優先順位を認識するのは困難です。この種の問題では、優先順位表を参照する代わりに、括弧を追加して表現の順序を明確にすることができます。改良した表現を以下に示します。
(--y)||((++x)&&(++z));
ヒント: 非常に多くの演算子の優先順位を覚えるのは難しいため、読者は実際のアプリケーションでよく練習する必要があります。
Java 演算子にはこのような優先関係があるため、SCJP または一部の企業の面接で質問する場合は、次の Java コードがあります。
int a = 5;
int b = 4;
int c = a++- –b*++a/b– >>2%a–;
c の値は何ですか?このような発言は、長年この発言を見てきた老プログラマですら目がくらんでしまうほど恐ろしいものです。このようなコードは試験でしか出題されませんが、もしプログラマーがそのようなコードを書いたら、プログラム開発をまったく理解していないため、すぐに退場しなければならないのではないかと思います。
ソースコードは文書であり、コードの効率よりもソースコードの読みやすさが重要です。そこで皆さんに思い出していただきたいのは、次のとおりです。
- 式を複雑にしすぎないでください。式が複雑すぎる場合は、いくつかのステップに分けて完成させてください。
- 式の実行順序を制御するために演算子の優先順位にあまり依存しないでください (可読性が高すぎるため)。式の実行順序を制御するには
()
を使用するようにしてください。