Java运算符优先级应靠分组理解而非死记,关键陷阱包括&&/||优先级低、==与=差异大、位运算符易误判、!优先级高于==、赋值运算符优先级最低;实操中一律加括号明确意图。

Java 运算符优先级不靠死记硬背,关键在理解分组逻辑和避开高频陷阱。口诀只是辅助,真正管用的是“看到就加括号”的实操习惯。
口诀怎么记才不翻车
常用口诀如“单算移关与,异或逻条赋”,对应: - 单:一元运算符(!、~、++、--、+、-) - 算:算术运算符(* / % + -) - 移:位移(> >>>) - 关:关系运算符( >= instanceof) - 与:按位与 & - 异或:^ - 逻:逻辑与 &&、逻辑或 || - 条:三元条件 ?: - 赋:赋值类(= += &= 等)
但要注意:这个口诀只反映大致顺序,没体现结合性,也没区分 & 和 && 的语义差异。比如 & 是“按位与”,&& 才是“短路逻辑与”,而它们的优先级还差着好几档——& 比 == 高,&& 却比 == 还低。
真正危险的几个优先级断层
这些地方最容易写错又不易察觉:
- ! 比 == 优先级高:!a == b 等价于 (!a) == b,不是 !(a == b)。想判相等再取反,必须写 !(a == b) 或 a != b
- & 和 | 在 == 后面:a == b & c 实际是 a == (b & c),不是 (a == b) & c。布尔判断别用 &,该用 &&
- == 和 = 天差地别:a = b == c 等价于 a = (b == c),因为 == 优先级远高于 =;但 a == b = c 直接编译失败(= 右结合,但 b = c 返回值不能参与 == 左侧)
- 字符串拼接 + 优先级低于算术:"a" + 3 * 2 → "a6",不是 "a32";因为 * 先算,再拼接
日常编码怎么用才稳
不用纠结全部17级,盯住三类场景加括号就行:
立即学习“Java免费学习笔记(深入)”;
- 混合比较和逻辑:if ((x > 0) && (y
- 位掩码判断:(flags & READ_MASK) != 0,而不是 flags & READ_MASK != 0(后者被解析为 flags & (READ_MASK != 0),报错)
- 赋值嵌套表达式:int z = (x = y + 1) * 2;明确 x 先赋值再参与乘法
- 涉及 !、==、&& 混用时,一律先包比较:! (obj != null && obj.isActive()) 比 !!obj.isActive() 清晰安全
比口诀更管用的两个习惯
一是打开 IDE 的语法高亮,IntelliJ 或 VS Code 都会把子表达式自动分组着色,一眼看出 a = b == c 中 b == c 是一个整体; 二是写完复杂表达式,心里默念“从左到右、看优先级、遇括号停”,然后删掉括号试试——如果结果变了,说明你刚才靠直觉写的,不是靠规则写的。


















