Java运算符优先级决定“谁先算”,结合性解决“同级怎么连着算”;高优先级如*、/、%先于+、−,关系运算符高于&&,&&高于||,赋值运算符优先级最低;多数二元运算符左结合,赋值和三元运算符右结合;一元运算符优先级高但前缀后缀行为不同;括号是唯一可靠控制手段。

Java 运算符的优先级和结合性共同决定了复合表达式中各部分的计算顺序。优先级决定“谁先算”,结合性解决“同级运算符怎么连着算”。不理解这两点,看似简单的表达式也可能得出意外结果。
优先级决定运算先后顺序
Java 按固定优先级表对运算符分层,高优先级运算符总是先与其操作数结合。例如:
-
乘除模(*、/、%)高于加减(+、−):表达式
a + b * c等价于a + (b * c),不是(a + b) * c -
关系运算符(>、==等)高于逻辑与(&&),逻辑与又高于逻辑或(||):表达式
a > b && c == d || e < f实际按((a > b) && (c == d)) || (e < f)执行 -
赋值运算符(=、+=等)优先级最低:在
int x = a + b && c;中,a + b && c全部算完才赋值给x
结合性解决同级运算的执行方向
当多个相同优先级的运算符连续出现时,结合性决定从左还是从右处理:
-
大多数二元运算符左结合:如
a - b - c等价于(a - b) - c,不是a - (b - c) -
赋值类运算符右结合:如
a = b = c等价于a = (b = c),所以b = c先执行,再把结果赋给a -
三元运算符(? :)也是右结合:表达式
a ? b : c ? d : e解析为a ? b : (c ? d : e),不是(a ? b : c) ? d : e
一元运算符容易被误判
像 ++、!、- 这类一元运算符优先级很高,常紧贴操作数绑定,但前缀和后缀行为不同:
立即学习“Java免费学习笔记(深入)”;
-
!a == b实际是(!a) == b,不是!(a == b) -
a++ == b是先比较a和b,再让a自增;而++a == b是先自增再比较 -
-a + b是(-a) + b,不会误解为-(a + b)
括号是唯一可靠控制手段
优先级和结合性是语言规则,不能修改。唯一能明确干预求值顺序的方式就是加括号:
-
a & b == c会被解析为a & (b == c)(因为==优先级高于&),若本意是(a & b) == c,必须显式加括号 -
flag ? x + y : z == w中,==会先于?:绑定,正确写法是flag ? x + y : (z == w) - 即使你“知道”某个顺序,加括号也能提升可读性,减少维护风险


















