运算符优先级如下:
(上一行的优先级大于下一行)
运算符说明 | Java运算符 |
---|---|
分隔符 | . [] () {} , ; |
单目运算符 | ++ -- ~ ! |
强制类型转换运算符 | (type) |
乘法、除法、求余 | * / % |
加法、减法 | + - |
移位运算符 | << >> >>> |
关系运算符 | < <= >= > instanceof |
等价运算符 | == != |
按位与 | & |
按位异或 | ^ |
按位或 | | |
条件与 | && |
条件或 | || |
三目运算符 | ? : |
赋值 | = += -= *= /= &= |= ^= %= <<= >>= >>>= |
public class Test {
public static void main(String[] args) {
int a = 1;
a++;
a += a--;
// 4
System.out.println(a);
a += ++a;
// 9
System.out.println(a);
}
}
字节码
0 iconst_1 // 将int型1推送至栈顶
1 istore_1 // 将栈顶int型值存入第二个本地变量
2 iinc 1 by 1 // 将指定int型变量增加1
5 iload_1 // 将第二个int型本地变量推送到栈顶
6 iload_1
7 iinc 1 by -1
10 iadd // 将栈顶两个int型整数值相加并将结果压入栈顶
11 istore_1
12 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
15 iload_1
16 invokevirtual #3 <java/io/PrintStream.println : (I)V>
19 iload_1
20 iinc 1 by 1
23 iload_1
24 iadd
25 istore_1
26 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
29 iload_1
30 invokevirtual #3 <java/io/PrintStream.println : (I)V>
33 return
a += a--;
- 将赋值运算(+=)两边的值分别推到栈顶,这里左右两边的值分别为2,2;
- 本地变量 a 将减少 -1(a--),注意本地变量更改后未使用,IntelliJ IDEA会提示;
- 将栈顶两个值(2, 2)相加并保存在本地变量a中。