运算符结合性决定同级运算符的分组方向:左结合如a+b+c等价于(a+b)+c,右结合如a=b=c等价于a=(b=c);Java中多数二元运算符左结合,赋值和三元运算符右结合。

运算符的结合性(Associativity)描述的是当多个相同优先级的运算符连续出现时,表达式如何分组计算。它不决定谁先算,而是决定“从左往右”还是“从右往左”加括号。
结合性只在同级运算符连用时起作用
比如 a + b + c 中,+ 是左结合,等价于 (a + b) + c;而 a = b = c 中,= 是右结合,等价于 a = (b = c)。如果混用不同优先级的运算符(如 a + b * c),起主导作用的是优先级,不是结合性。
常见运算符的结合方向要记牢
Java 中绝大多数二元运算符都是左结合,包括:
- 算术运算符:+, -, *, /, %
- 关系与相等运算符:==, !=, , =
- 位运算符:&, |, ^, <<, >>, >>>
- 逻辑运算符:&&, ||(注意:它们是短路的,但结合性仍是左结合)
只有少数是右结合:
立即学习“Java免费学习笔记(深入)”;
- 赋值类:=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=
- 条件运算符:? :(三元运算符,唯一一个右结合的非赋值运算符)
结合性影响结果,尤其在赋值和条件表达式中
看这个例子:
int a = 1, b = 2, c = 3;
a = b = c;
因为 = 右结合,实际执行顺序是 a = (b = c),先将 c 的值(3)赋给 b,再把 b 的新值(3)赋给 a,最终 a、b、c 都是 3。
如果它是左结合(实际不是),就会变成 (a = b) = c,而 a = b 是一个值(即 b 的值),不能作为左值再被赋值,编译直接报错。
别把结合性跟求值顺序混淆
结合性管的是“语法分组”,不是“操作数何时计算”。比如 f() + g() + h() 是左结合,意味着加法按 (f() + g()) + h() 分组,但 Java 并不规定 f()、g()、h() 的调用顺序——JVM 可以按任意顺序求值(实践中通常是从左到右,但这属于实现细节,不是语言规范保证)。


















