Java运算符优先级由语法结构决定,反映编译器自然分组方式:优先级定结合顺序,结合性定同级执行方向;单目最高,赋值最低且右结合,? : 唯一三目、介于||与赋值间。

Java运算符优先级不是靠死记硬背的表格,而是由语言规范定义的语法结构决定的——它本质上反映的是表达式如何被编译器“自然分组”。理解的关键在于:**优先级决定结合顺序,结合性解决同级运算的执行方向**。
单目运算符:紧贴操作数,最高优先级
包括 ++、--(前置/后置)、+、-(正负号)、!、~、(type)(强制类型转换)等。它们作用于单个操作数,且离操作数最近,所以最先被解析。
- 前置++(如 ++i)和后置++(如 i++)虽然同属单目,但后置的优先级略高于前置——这不是错误,而是因为后置形式在语法上更“粘”操作数;实际效果差异体现在表达式求值时机,而非优先级表里的位置
- 类型转换 (int) x + y 等价于 ((int) x) + y,不是 (int) (x + y),说明 (type) 是单目运算符,只管紧邻的表达式
算术与位运算:按层级分组,从左到右结合
乘除模(*、/、%)优先级高于加减(+、-);位移(<<、>>、>>>)居中;位与(&)、异或(^)、位或(|)依次降低。
- a + b << c 等价于 a + (b << c),因为位移比加法优先级高
- a & b ^ c | d 按照 ((a & b) ^ c) | d 执行,三者同级且左结合
- 注意 + 的双重身份:作为算术加法时服从此层级;作为字符串拼接时,仍遵循相同优先级,只是类型上下文改变了行为
关系与逻辑运算:区分“比较”和“判断”,避免常见陷阱
关系运算符(<、<=、>、>=、==、!=)优先级低于算术运算,但高于逻辑与(&&)、逻辑或(||)。
立即学习“Java免费学习笔记(深入)”;
- a + b == c && d > e 解析为 ((a + b) == c) && (d > e),不是 a + (b == c) && ...
- && 和 || 是短路运算符,优先级低、且左结合;& 和 |(非短路版)优先级远高于它们,常被误用 —— 比如 if (x != null & x.length() > 0) 可能触发空指针,而 && 才安全
赋值类运算符:最低优先级,右结合,天然形成链式
所有赋值运算符(=、+=、-=、<<= 等)优先级最低,且是右结合的。
- a = b = c 等价于 a = (b = c),先执行 b = c,再把结果赋给 a
- a += b == c 等价于 a += (b == c),不是 (a += b) == c,因为 == 优先级高于 +=
- 条件运算符 ? : 是唯一一个三目运算符,优先级介于逻辑或与赋值之间,且右结合:a ? b : c ? d : e 理解为 a ? b : (c ? d : e)
真正掌握优先级,不靠背表,而是在写表达式时主动加括号明确意图;遇到复杂嵌套,拆成多步变量更清晰。JVM 不关心你写了什么括号,只认字节码——但人需要可读性。


















