演算子の優先順位に関する注意点

例えば、Java で書かれた以下のプログラムの実行結果はどうなると思いますか。

public class Enzan {
    public static void main(String[] args){
        int val = 1 + 1 << 2;
        System.out.println(val);
    }
}

正解は 8 です。

ビットシフトは 2 のべき乗の値を求めたいときに使われることも多いので、どうしても加算、減算より優先順位が高いように思ってしまうかもしれませんが、実際は加算、減算より優先順位は低いです。

Java 、JavaScript 、C 、 PHP で共通するものでは、演算子の優先順位はだいたい以下のようになっています。先に挙げたもののほうが優先順位は高いです。

++ --  (インクリメント、デクリメント)
* / %  (乗算、除算、余剰)
+ -  (加算、減算)
<< >>  (左ビットシフト、右ビットシフト)
< > <= >=  (小なり、大なり、以下、以上)
== !=  (等しい、等しくない)
&  (ビット論理積)
^  (ビット排他的論理和)
|  (ビット論理和)
&&  (論理積)
||  (論理和)
?: (三項演算)
= *= /= %= += -= <<= >>= &= ^= |= (代入、複合代入)

 このように優先順位は定められていますが、加減乗除など優先順位が明らかなもの以外は括弧を付けた方がわかりやすいですし、確実です。