Java运算符结合性决定同优先级运算符的执行顺序:左结合(如+、-、*)从左到右计算,右结合(如=、!、?:)从右到左计算;需与优先级配合理解,括号可避免歧义。

Java 运算符结合性直接影响表达式中**同优先级运算符的执行顺序**,不注意它,结果可能和直觉完全相反。它本身不改变不同优先级之间的先后(那是优先级的事),只在“多个相同优先级运算符并列出现”时起决定作用。
左结合性:从左往右挨个算
大多数二元运算符(如 +、-、*、/、%、==、&&、||)都是左结合的。这意味着表达式会像“排队”一样,从最左边开始,逐步向右组合。
-
例如:
10 - 3 - 2→ 等价于(10 - 3) - 2 = 5,不是10 - (3 - 2) = 9 -
再如字符串拼接:
"a" + 1 + 2→ 先算"a" + 1得"a1",再算"a1" + 2得"a12";而1 + 2 + "a"→ 先算1 + 2 = 3,再3 + "a" = "3a"
右结合性:从右往左倒着套括号
只有三类运算符是右结合的:一元运算符(如 !、++、--、~)、赋值类(=、+=、-= 等)、三目运算符(?:)。它们的计算方向是反的,容易出错。
-
赋值连写:
a = b = c→ 等价于a = (b = c),先给b赋值,再把c的值赋给a -
三目嵌套:
a ? b : c ? d : e→ 因为 ?: 右结合,实际等价于a ? b : (c ? d : e),而不是(a ? b : c) ? d : e -
前缀自增:
int x = 5; int y = ++x + ++x;中,两个++x都是右结合的一元运算,但更关键的是它们的求值顺序与副作用叠加——这常导致不可预测结果,应避免
结合性 + 优先级 = 实际计算路径
两者必须一起看。比如 a = b + c * d:
- 先按优先级:
*比+高,比=更高 → 先算c * d - 再按结合性:
+左结合 →b + (c * d);=右结合 →a = (b + (c * d)) - 最终顺序:c*d → b+结果 → 赋值给a
怎么避免被结合性坑?
最稳妥的方式就是**主动加括号**。Java 不强制你依赖默认结合规则,尤其在混合算术、逻辑、位运算或嵌套三目时。
- 写
a & b == c很危险 ——==优先级高于&,实际是a & (b == c),通常你想的是(a & b) == c - 写
flag ? x + y : z == w也容易错 ——==会先绑定z == w,再参与三目,应明确写成flag ? (x + y) : (z == w) - 复杂表达式哪怕多加几对括号,也比调试半天强
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











