Java运算符优先级从高到低关键层级为:后置++/-- > 前置++/--、!、~、+、- > *、/、% > +、- > = > ==、!= > & > && > || > 赋值类=、+=等;结合性上,赋值和三元?:为右结合,其余多为左结合。

Java 表达式不是从左到右依次算的,而是严格按 运算符优先级 和 结合性 规则执行;写错顺序可能让 a + b * c 被误以为先加后乘,实际是先乘后加。
常见运算符优先级从高到低怎么排?
记住几个关键层级就够了,不用背全部 15 级:
-
++、--(后置) >++、--(前置) >!、~、+(正号)、-(负号) -
*、/、%高于+、-(加减) -
==、!=低于、、>、>= -
&&高于||,但都远低于关系运算符 -
=(赋值)是最低优先级之一,比几乎所有运算符都低
比如 a = b + c > d ? e : f 中,> 先算,再 ?:,最后才 = —— 不加括号极易误解。
结合性不等于优先级,但它决定同级怎么算
优先级相同才看结合性。Java 大多数二元运算符是 左结合(从左往右),但几个关键例外:
-
=、+=、-=等赋值运算符是 右结合:所以a = b = c等价于a = (b = c) -
++、--(后置)是左结合,但语义上“先用后变”,和前置行为完全不同 -
?:是唯一三元运算符,右结合:a ? b : c ? d : e解析为a ? b : (c ? d : e)
混淆结合性会导致逻辑错误,比如 a = b += c 实际是 a = (b += c),不是 (a = b) += c(后者非法)。
哪些地方最容易因优先级翻车?
不是所有表达式都需要括号,但以下场景不加括号几乎必出 bug:
- 位运算混用:
a & b == c→ 实际是a & (b == c),因为==优先级高于&;正确写法是(a & b) == c - 逻辑与/或混用:
a && b || c && d没问题(&&先于||),但a || b && c容易读错,建议写成a || (b && c) - 移位和加减:
a 是a ,不是(a ;想后者必须加括号 - 字符串拼接 + 数学混合:
"x=" + a + b * c会先拼"x=" + a(转字符串),再拼b * c结果,而非先算b * c再拼 —— 因为+对字符串是左结合且优先级低于*,但遇到字符串后整个左边都变成字符串上下文
调试时怎么看实际计算顺序?
IDE(如 IntelliJ)把鼠标悬停在表达式上,通常能高亮显示分组结果;但更可靠的是用
javap -c看字节码:
public static int test() {
return 1 + 2 * 3 >> 1;
}反编译后你会看到 iconst_2、iconst_3、imul(先乘),再 iconst_1、ishr(右移),最后 iadd(加)—— 顺序一目了然。别依赖“我觉得它该这么算”,字节码不会骗人。
真正难的不是记住哪一级高,而是意识到 == 比 & 高、+ 比 低、以及字符串 + 在混合类型时会提前触发类型提升。这些点不写括号,过三个月自己都看不懂。










