在Java编程中,表达式的求值顺序由语言规范定义的运算符优先级决定。当一行代码里同时出现多种运算符时,编译器严格按照优先级从高到低结合,而不是简单地从左到右执行。理解这套规则,是写出正确且易读代码的基础。

一、Java运算符优先级完整表格
下面这张表格列出了Java中所有主要运算符类别,并按照优先级从高到低排列。优先级数值越小,表示结合得越紧密、越早被求值。同一行内的运算符优先级相同,通常从右向左或从左向右结合取决于具体运算符。
| 优先级 | 运算符类别 | 具体运算符 | 结合性 |
|---|---|---|---|
| 1 | 后缀 | expr++ , expr-- | 左到右 |
| 2 | 一元(前缀) | ++expr , --expr , + , - , ~ , ! | 右到左 |
| 3 | 乘性 | * , / , % | 左到右 |
| 4 | 加性 | + , - | 左到右 |
| 5 | 移位 | << , >> , >>> | 左到右 |
| 6 | 关系 | < , > , <= , >= , instanceof | 左到右 |
| 7 | 相等 | == , != | 左到右 |
| 8 | 按位与 | & | 左到右 |
| 9 | 按位异或 | ^ | 左到右 |
| 10 | 按位或 | | | 左到右 |
| 11 | 逻辑与 | && | 左到右 |
| 12 | 逻辑或 | || | 左到右 |
| 13 | 三元条件 | ? : | 右到左 |
| 14 | 赋值 | = , += , -= , *= , /= , %= , &= , ^= , |= , <<= , >>= , >>>= | 右到左 |
从表中可以看出,后缀自增自减优先级最高,意味着它们会先于周边其他运算发生。赋值类运算符永远处于最底层,所以像 a = b + c 这样的语句一定是先算出右边加法结果,再执行赋值。
需要特别留意的是,逻辑与 && 和逻辑或 || 低于位运算符,且具备短路特性。很多初学者误以为 & 和 && 只是写法不同,实际上前者是位运算或非负短路的布尔运算,优先级还更高,混用会导致条件判断逻辑偏离预期。
二、容易踩坑的优先级误区
即便看过表格,实际写代码时仍常掉进几个典型陷阱。例如算术运算符和移位运算符相邻时,加号减号优先级高于左右移,这和反直觉的“移位很底层”感觉相反。还有相等判断和逻辑运算混用时,== 优先于 &&,但低于算术运算。
看下面这段有问题的代码:
public class PriorityTrap {
public static void main(String[] args) {
int a = 5;
int b = 10;
// 本意是先比较大小再逻辑与,但+优先级高于>,导致先加后比
if (a + 5 > b && a < 10) {
System.out.println("条件成立");
} else {
System.out.println("条件不成立");
}
// 实际等价于 (a+5)>b 且 a<10
// 若想表达 a+(5>b && a<10) 则必须加括号
}
}
上面例子中,因为 + 比 > 优先级高,所以 a + 5 > b 会先完成加法再比较,和某些开发者以为的“先判断5是否大于b”完全不同。这种错误在复杂表达式里极难肉眼排查。
另一个常见错误是把赋值当成一个低优先级但可随意嵌套的操作。由于赋值结合性是右到左,连续赋值 x = y = 0 实际是 x = (y = 0),这虽然合法,但如果和三元运算符混写,例如 a = b > 0 ? c = 1 : c = 2,在Java中会因优先级问题直接编译报错,必须给三元分支加括号。
三、实用记忆技巧
死记硬背表格效率很低,可以用几条口语化规律覆盖绝大多数场景。第一条:单目运算符最优。无论是 ++、-- 还是逻辑非 !,都紧挨变量,优先于任何双目符号。第二条:算术胜过移位,移位胜过关系。也就是先算加减乘除,再移比特,再比大小。第三条:比较完再逻辑,与比或高,赋值垫底。
把规律串成一句顺口溜:单目算术移关系,相等位逻与或条,赋值最后莫心急。其中“条”指三元条件运算符。每天写代码前在心里过一遍,比翻表格快得多。
此外,当表达式长度超过屏幕半行,或者混合了三类以上运算符,不要依赖记忆,直接加括号。括号不仅能强制顺序,更是给后续维护者最清晰的注释。例如下面改写就一目了然:
public class ClearExpr {
public static void main(String[] args) {
int x = 3, y = 7, z = 2;
// 不加括号易误读,加上后语义清晰
boolean result = ((x + y) > (z << 2)) && (y % 2 == 1);
System.out.println(result);
}
}
这个例子里,我们先用括号锁定算术和移位比较,再包裹逻辑与,任何人读代码都不会纠结优先级。记住,编译器不嫌括号多,人脑才需要减负。
四、结合代码验证你的理解
建议动手跑几个小程序来固化认知。比如利用自增和逻辑非组合,观察输出顺序;或者故意写错优先级再看加括号后的修正效果。只有从运行结果反推结合过程,才算真正掌握。
下面给出一个综合练习,你可以先心算结果再运行核对:
public class Practice {
public static void main(String[] args) {
int i = 2;
int j = 3;
// 三元、赋值、算术混合
int k = i++ + j > 4 ? i + j : i * j;
System.out.println("i=" + i + ", j=" + j + ", k=" + k);
// 拆解:i++先用2再加,2+3=5>4成立,此时i已是3,三元取i+j即3+3=6
}
}
运行后会发现 i 变成3,k 得到6。如果之前猜错,说明对后缀自增和三元运算符优先级还不够敏感。多写几组类似练习,运算符优先级就会从文档知识变成肌肉记忆。
Java运算符优先级运算符表格优先级记忆技巧修改时间:2026-08-02 13:39:38