运算符优先级决定表达式中各运算符的执行顺序,括号优先级最高,其次是一元、乘性、加性、比较、逻辑、条件、赋值运算符;相同优先级从左到右结合,逻辑与高于或,空值合并介于两者之间。

运算符优先级直接决定复杂表达式中各部分的计算顺序,不按预期加括号时,结果常和直觉不符。比如 3 + 4 * 5 得到的是 23 而不是 35,因为乘法比加法先算。
常见优先级层级(从高到低)
理解大致分组比死记数字更重要:
-
括号
():最高优先级,强制先算内部表达式,如(a + b) * c -
一元运算符:如
!、++、--、+、-(正负号),紧贴操作数,如!true或++x -
乘性运算符
* / % **:乘、除、取余、幂运算,优先于加减 -
加性运算符
+ -:注意+有双重身份——既做加法也做字符串拼接,类型混合时会隐式转换 -
比较与相等运算符
== === != !==:全部在加减之后执行,例如5 + 3 == 8先算左边和右边的加法,再比较 -
逻辑运算符
&& || ??:&&比||优先级高,??(空值合并)比&&低但比||高 -
条件运算符
? ::三元运算整体作为一个单元,优先级低于逻辑运算符 -
赋值运算符
= += -=等:最低之一,所以a = b + c * d不会先赋值再算,而是先完成右侧所有运算
容易出错的典型场景
几个高频踩坑点:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
逻辑与/或混用没加括号:如
a && b || c && d实际等价于(a && b) || (c && d),但若本意是a && (b || c) && d,就必须显式加括号 -
字符串拼接遇上算术运算:如
"1" + 2 * 3→ 先算2 * 3得6,再拼成"16";而("1" + 2) * 3→ 先拼成"12",再转为数字12后乘3得36 -
赋值语句中的条件判断:如
let x = a || b && c ? d : e,实际解析为let x = (a || (b && c)) ? d : e,因为&&>||>? : -
void 和逗号运算符干扰:如
void 0 === undefined是(void 0) === undefined,不是void (0 === undefined),因为void优先级很高
实用建议:怎么写更安全
靠记忆完整优先级表不现实,日常开发中更推荐以下做法:
- 只要涉及两个以上不同类运算符,就加括号:哪怕你觉得“应该没问题”,括号能立刻消除歧义,提升可读性
-
拆分长表达式为中间变量:比如把
result = a * b + c / d > e && f !== null ? g : h改成几步,每步只做一类事 -
用严格相等
===替代==:避免类型转换干扰判断逻辑,也减少因优先级+隐式转换叠加导致的意外 -
逻辑表达式多用早期返回代替嵌套:比如用
if (!a || !b) return;代替a && b && doSomething(),语义更清晰,也不依赖优先级推演
本质上,优先级是语言规则,不是编程技巧。写清楚比写“巧妙”更重要——括号不是妥协,是沟通。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










