演算子の優先順位と結合規則
既に確認した算術演算子やその他の演算子を使用する時に、1つの式の中に複数の演算子があった場合を考えてみます。次の例を見て下さい。
int num; num = 10 + 5 * 4;
このような場合、どのように計算が行われるのかは二つの可能性があります。まずは10と5の加算が先に行われ、次に加算の結果と4の乗算が行われる場合です。
1) 10 + 5 = 15 2) 15 * 4 = 60 3) num = 60
この場合は、変数「num」に60が代入されます。もう一つは5と4の乗算が先に行われ、次に乗算の結果と10の加算が行われる場合です。
1) 5 * 4 = 20 2) 10 + 20 = 30 3) num = 30
このようにどの演算が先に行われるのかによって式全体の結果が異なってきます。
演算がどの順番で行われるのかは演算子の優先順位と結合規則によって決まります。優先順位はどの演算が先に行われるのかを決定するのに使われ、結合規則は優先順位が同じ演算子だった場合にどの演算が先に行われるのかを決定するのに使います。
演算子の優先順位と結合規則は次の通りです。
優先順位 高い ------------------------------------------------ 左 (引数) [配列添字] . ++ --(後置き) 右 ! ~ + - (単項演算子) ++ --(前置き) 右 new (型) 左 * / % 左 + - (算術演算子) 左 << >> >>> 左 > >= < <= instanceof 左 == != 左 & 左 ^ 左 | 左 && 左 || 右 ?: 右 = ope= ------------------------------------------------ 優先順位 低い
※ ope= は「+=」「-=」「*=」「/=」「%=」「<<=」「>>=」「>>>=」「&=」「|=」「^=」のことです。
上に書かれているほど優先順位が高く、下になるほど優先順位は低くなります。同じ行に書かれている演算子は優先順位に違いはありません。
例として「*」と「+」を見てください。「*」の方が「+」よりも上に書かれていますので「*」の方が優先順位が高くなっています。その為、同じ式の中で「*」と「+」の2つの演算子があった場合にはまず先に「*」を使った演算が行われます。
次の例を見てください。
int num; num = 10 + 5 * 4;
上記の例では、先に「5 * 4」の演算が行われ、そして次に「10 + 20」の演算が行われます。そして最後に「=」によって変数「num」に30が代入されます。今まで特に意識せずに使ってきましたが「=」も演算子の一つでありそして最も優先順位が低い演算子です。その為「=」演算子による代入は最後に行われます。
次に優先順位が同じ演算子があった場合です。例えば「+」と「-」は同じ優先順位です。優先順位が同じ場合には演算子の結合規則に従います。先ほどの一覧の各行の一番左に書かれているのが結合規則です。左の場合は左結合、右の場合は右結合と呼ばれます。演算子が左結合の場合には左から順に、右結合の場合には右から順に演算が行われます。
次の例を見てください。
int num; num = 10 + 5 - 4;
今回の場合、「+」と「-」は優先順位が同じです。そして左結合の演算子のためまず「10 + 5」の演算が先に行われ、そして次に「15 - 4」の演算が行われます。そして最後に「=」によって変数「num」に11が代入されます。
今後出てくる各演算子を記述する上で、演算子の優先順位がどのようになっているのかを常に意識して記述するようにして下さい。
サンプル
では簡単なサンプルで試してみます。
class JSample4_1{ public static void main(String args[]){ int n1, n2; n1 = 10 * 5 + 4; n2 = 4 + 10 * 5; System.out.println(n1); System.out.println(n2); } }
コンパイル後に実行すると次のように表示されます。
記述した順番に関わり無く演算子の優先順位によってどの演算が先に行われるのかが決まっていることが確認できます。
( Written by Tatsuo Ikura )