Java运算符优先级表重在查阅而非死记,关键需掌握高频冲突组合:&&优先于||、==低于&&、位运算符低于比较运算符、赋值运算符优先级最低且右结合;自增/自减的副作用时机比优先级更易引发错误;位操作混用比较时务必加括号。

Java运算符优先级表不是用来背的,而是用来查的
Java里没有“必须记住全部15级优先级”的硬性要求——真写复杂表达式时,靠括号比靠记忆靠谱得多。但如果你常遇到 a & b == c 行为不符合预期、++i + i++ 结果难预测、或 boolean a = false || true && false 判定出错,说明你已经踩进优先级坑里了。
真正需要关注的是高频冲突组合:
-
&&比||优先级高(所以false || true && false等价于false || (true && false)) -
==和!=比&&低(a == b && c == d不用括号也安全,但a & b == c实际是a & (b == c)) - 赋值类运算符(
=,+=,??=)优先级最低,且右结合——a = b = c先算b = c,再赋给a
别信“自增自减运算符优先级高”这种模糊说法
很多人以为 ++i 一定比 + 先算,结果写出 ++i + i++ 还试图心算结果。问题不在优先级,而在求值顺序和副作用时机。
关键事实:
立即学习“Java免费学习笔记(深入)”;
-
++i(前缀):先自增,再参与表达式计算 -
i++(后缀):先用原值参与表达式计算,再自增 - Java不规定同级运算符的左右操作数求值顺序(JLS §15.7),
i++ + ++i的行为在不同JVM上可能不同 - 实际建议:永远不要在同一个表达式里对同一变量多次读写,哪怕语法合法
位运算符和比较运算符混用时最容易翻车
典型错误现象:if (flags & MASK == 0) 总是走 else 分支,但 MASK 确实没被设置。
原因:== 优先级高于 &,这行实际等价于 if (flags & (MASK == 0)) —— 而 MASK == 0 是布尔值,会被转成 0 或 1,根本不是你想要的按位判断。
正确写法(必须加括号):
if ((flags & MASK) == 0)
其他常见位操作陷阱:
-
|和||混用:if (a | b > 0)实际是if (a | (b > 0)),不是逻辑或 -
^(异或)优先级介于&和|之间,a ^ b & c等价于a ^ (b & c) - 移位运算符
/<code>>>优先级低于加减,a + b 是 <code>(a + b) ,不是 <code>a + (b
三元运算符 ? : 的结合性和括号必要性
它右结合,但优先级非常低——比几乎所有二元运算符都低,只比赋值高。这意味着它很容易被“截断”。
比如:a ? b : c + d 是 a ? b : (c + d),没问题;但 a + b ? c : d 就是 (a + b) ? c : d,如果 a + b 是整数,编译直接失败。
更隐蔽的问题:
-
a ? b : c == d→a ? b : (c == d)(因为==优先级高于? :) -
a == b ? c : d == e→(a == b) ? c : (d == e)(看起来合理,但可读性差) - 只要三元表达式任一分支本身是复合表达式,就该加括号:
a ? (b + c) : (d - e)
复杂嵌套三元表达式基本等于自找麻烦,不如拆成 if-else。









