Java运算符优先级固定,应通过括号和掌握四组高频关系(! > 算术 > 关系 > && > ||)来避免错误;赋值运算优先级最低;括号是明确意图的推荐实践,非冗余。

Java 运算符优先级本身是固定的,不能“写”出来改变,但你可以通过 合理加括号 和 理解常见优先级分组 来避免逻辑混乱。关键不是记住全部15级,而是掌握高频组合的执行顺序,并主动用括号显式表达意图。
优先掌握这四组高频优先级关系
多数逻辑混乱来自这四类混合运算,记清它们的相对顺序比死背整张表更实用:
-
!(逻辑非) > 算术运算(+ - * / %) > 关系运算(== != =) > && > ||
例:
!a == b实际等价于(!a) == b,不是!(a == b)—— 很多人在这里出错 -
== 和 != 优先级相同,且低于 、=
所以
a d等价于(a d)(结果是 boolean 比较 boolean),不是你想的链式比较 -
&& 比 || 优先级高
a || b && c等价于a || (b && c),不是(a || b) && c -
赋值运算符(= += -= 等)优先级最低(除逗号运算符)
a = b == c等价于a = (b == c),不会误判成(a = b) == c
括号不是“可选”,而是“默认推荐”
只要表达式含两个及以上不同类运算符,就该加括号——这不是代码冗余,而是明确沟通意图:
- 写
if ((a + b) > c && d == e),而不是if (a + b > c && d == e)(虽然结果一样,但 + 和 > 的优先级容易被忽略) - 写
result = (x * y) + (z / w);,即使乘除已高于加法 (增强可读性,尤其当后续可能插入新操作时) - 布尔表达式中,
if ((flag1 && flag2) || (flag3 && !flag4))比嵌套不加括号清晰得多
警惕这些“看起来自然但危险”的写法
以下写法语法合法,但极易引发误解或维护陷阱:
立即学习“Java免费学习笔记(深入)”;
-
a & b == c:位与&和相等==优先级不同,实际是a & (b == c),而你可能想写(a & b) == c -
list.get(i) == null ? "" : list.get(i).toString():重复调用get(i),且==优先级高于三元运算符,没问题;但若写成list.get(i) == null || list.get(i).length() == 0 ? ...就可能空指针——这里优先级没错,但逻辑耦合导致隐患 -
a = b = c:虽然从右向左赋值(a = (b = c)),但可读性差,建议拆成两行
调试时快速验证优先级的小技巧
不确定某表达式怎么算?用最简方式验证:
- 写个测试片段,比如
System.out.println(true || false && false);→ 输出true,说明&&先于|| - 在 IDE 中把光标放在表达式上,看自动高亮的计算范围(IntelliJ/VS Code 都支持)
- 用 javap 查看字节码(进阶):简单表达式如
a + b * c编译后一定是先 iload b/c、imul,再 iload a、iadd


















