运算符优先级是编程语言和数学共用的硬性约定,决定复杂数学表达式计算顺序;从高到低为:括号、幂运算、一元运算符、乘除取模、加减、比较、逻辑运算,赋值优先级最低且右结合。

运算符优先级直接决定复杂数学表达式中各部分的计算顺序,稍有不慎就会得出完全错误的结果。它不是可选规则,而是编程语言和数学本身共同遵循的硬性约定。
常见运算符优先级从高到低排列
以大多数编程语言(如Python、Java、C)和标准数学规范为准:
- 括号 () —— 最高优先级,强制优先计算内部表达式
- 幂运算 ** 或 ^(注意:不同语言符号不同,如Python用**,Excel用^)
- 一元运算符 +、−、!、~(如负号 −5、逻辑非 !true)
- 乘、除、取模 *、/、%
- 加、减 +、−
- 比较运算符 ==、!=、>、=、
- 逻辑与 && 或 and
- 逻辑或 || 或 or —— 最低优先级
不加括号时,优先级常导致“直觉错误”
例如表达式:3 + 4 * 2 == 11,不是 14;因为 * 优先于 +,先算 4*2=8,再 3+8=11。
又如:2 ** 3 * 2 在 Python 中等于 16(先算 2**3=8,再 8*2=16),而非 2**(3*2)=64——因为幂运算是左结合且优先级高于乘法。
再如布尔表达式:a && b || c && d 实际等价于 (a && b) || (c && d),而不是从左到右依次计算,因为 && 优先级高于 ||。
如何避免出错?三个实用建议
- 多用小括号显式分组:哪怕符合默认优先级,加括号也能提升可读性与安全性,比如写成 (3 + 4) * 2 或 (a && b) || (c && d)
- 查清所用语言的具体规则:比如 JavaScript 中 ** 是右结合(2 ** 3 ** 2 → 2 ** 9 = 512),而多数其他语言幂运算是左结合或不支持链式
- 复杂表达式拆成多步变量赋值:例如把 x * y + z / w > a && !b 拆为 temp1 = x*y; temp2 = z/w; temp3 = temp1 + temp2; ... 这样既易调试,也彻底规避优先级歧义
特别注意易混淆的边界情况
负号和减号看似相同,但语义不同:−3 ** 2 在 Python 中结果是 −9(因为 ** 优先级高于一元 −,等价于 −(3**2)),而 (−3) ** 2 才是 9。
赋值运算符(如 =、+=)优先级通常很低,几乎最低,所以 a = b + c * d 不会因赋值而打断乘加运算;但链式赋值如 a = b = c 是从右向左结合的。










