掌握四组关键优先级关系并主动加括号最实用:!高于&&和==;&&高于||;算术运算高于关系运算;赋值运算优先级最低;位运算与比较混用时必须加括号,如(flags & MASK) == 0。

Java 运算符优先级不能靠死记硬背,真正管用的是掌握几组关键关系 + 主动加括号。记住全部15级既难又没必要,日常出错的90%都集中在几个高频混用场景。
重点记这四组相对顺序
不用记数字级数,盯住以下四类运算符之间的“谁先算”:
-
!(逻辑非)比 && 和 == 都高 →
!a == b等价于(!a) == b,不是!(a == b) -
&& 比 || 高 →
a || b && c实际是a || (b && c),不是(a || b) && c -
算术运算(+ - * / %) 比 关系运算( == !=) 高 →
a + b == c先算加法,符合直觉,但容易忽略 -
赋值运算(= +=等) 优先级最低 →
a = b == c等价于a = (b == c),不会误成(a = b) == c
位运算和比较混用时最危险
比如 flags & MASK == 0,看起来像“判断 MASK 是否未设置”,实际执行的是 flags & (MASK == 0) —— 因为 == 优先级高于 &,而 MASK == 0 是布尔值(true/false),会被转成 1 或 0,完全偏离本意。
正确写法必须加括号:(flags & MASK) == 0。
立即学习“Java免费学习笔记(深入)”;
类似情况还有:a & b == c、a ^ b > 0、value (其实是 <code>value ,不是 <code>(value )。
括号不是可选项,是默认动作
只要表达式里出现两种及以上类型运算符,就该加括号。这不是啰嗦,而是把你的意图“钉”在代码里:
- 写
if ((x > 0) && (y ,不写 <code>if (x > 0 && y —— 后者虽没错,但扫一眼不如前者清晰 - 写
result = (a * b) + (c / d) - (e % f),哪怕乘除天然高于加减 - 布尔组合强烈建议分组:
if ((flag1 && flag2) || (flag3 && !flag4))
别被自增/自减误导
很多人以为 ++i 优先级高,就能放心混写,结果掉进求值顺序陷阱。比如 i++ + ++i,Java 不规定左右操作数谁先求值,不同 JVM 可能给出不同结果。
真正要警惕的不是优先级,而是副作用时机。安全做法:同一个表达式里,不要对同一变量多次读写。拆成两行更稳妥:
int temp = i++;result = temp + (++i);


















