Java Operator Precedence

2025年7月21日 | 阅读 5 分钟

运算符优先级表示两个表达式如何绑定在一起。在表达式中,它决定了运算符与操作数的组合方式,并决定了表达式将如何求值。

简单来说,运算符优先级有助于 Java 编译器理解在单个表达式中涉及多个运算符时,应该先执行哪些操作。

运算符优先级很重要,因为如果我们不了解执行顺序,可能会得出错误的结果。程序员必须记住优先级,以避免在计算或逻辑中出现意外行为。

在求解表达式时,必须牢记两点:第一是优先级,第二是结合性

Java Operator Precedence

优先级

优先级是不同类型的运算符与其操作数组合的优先级。仅当表达式包含多个具有较高或较低优先级的运算符时才有意义。优先级较高的运算符会先求值。如果我们想先求值优先级较低的运算符,应该使用括号来覆盖默认顺序。

例如,考虑以下表达式。

无括号

有括号

我们观察到,当表达式中没有使用括号时,它的求值结果是 14。而当我们使用了括号时,表达式的求值结果是 20。这意味着在表达式 (2 + 3) * 4 中,优先级较低的运算符会先求值,然后是乘法。

结合性

如果表达式中包含两个或多个具有相同优先级的运算符,则必须遵循结合性。在这种情况下,表达式可以根据情况从左到右从右到左进行求解。当出现两个或多个具有相同优先级的运算符时,结合性决定了求值的方向。Java 中的大多数运算符都是左结合的,这意味着它们是从左到右求值的。

Java 运算符优先级表

下表描述了 Java 中使用的运算符的优先级和结合性。

优先级运算符类型结合性
15()
[]
·
括号
数组下标
成员选择
从左到右
14++
--
一元后置自增
一元后置自减
从右到左
13++
--
+
-
!
~
(类型)
一元前置自增
一元前置自减
一元加
一元减
一元逻辑非
一元按位非
一元类型转换
从右到左
12*
/
%
乘法
除法
取模
从左到右
11+
-
加法
减法
从左到右
10<<
>>
>>>
按位左移
带符号右移
无符号右移
从左到右
9<
<=
>
>=
instanceof
关系小于
关系小于等于
关系大于
关系大于等于
类型比较(仅限对象)
从左到右
8==
!=
关系等于
关系不等于
从左到右
7&按位与从左到右
6^按位异或从左到右
5|按位或从左到右
4&&逻辑与从左到右
3||逻辑或从左到右
2? :三元条件运算符从右到左
1=
+=
-=
*=
/=
%=
赋值
加法赋值
减法赋值
乘法赋值
除法赋值
模赋值
从右到左

注意:数字越大,优先级越高。

例如,优先级为 15 的运算符先于优先级为 14 的运算符进行求值,依此类推。

Java 运算符优先级示例

考虑以下表达式。

您可能认为答案是18,但事实并非如此。因为乘法 (*) 运算符的优先级高于加法 (+) 运算符。因此,表达式首先求值 5*3,然后求值剩余的表达式,即 1+15。所以,答案将是16

让我们看另一个表达式。

在上面的表达式中,由于优先级,* 和 / 运算先于 + 执行。由于结合性,y 先乘以 z,然后再除以 k。

让我们为上面的表达式赋值并求解。

示例

编译并运行

输出

10

解释

该表达式可以求解为:2 + (4 * 6 / 3) → 2 + (24 / 3) → 2 + 8 = 10

注意:使用括号可以使表达式更清晰,并覆盖默认优先级。

Java 运算符优先级的应用

1. 数学计算:运算符优先级可确保算术表达式(如计费系统、金融应用程序和科学计算)中的正确顺序。

在这里,乘法根据优先级进行,确保面积计算准确。

2. 决策中的条件逻辑:在 if-else 或 switch-case 中,像 &&、||、! 和 == 这样的运算符会根据优先级规则使用。

3. 短路求值:逻辑运算符(&&、||)使用优先级和结合性来避免不必要的求值,从而提高性能。

4. 循环中的复杂赋值:复合赋值运算符(如 +=、*=)在循环和更新中频繁使用。

注意:由于运算符优先级,乘法先于加法发生。

5. 游戏引擎或物理计算中的表达式求值:运算符优先级确保涉及力、重力、速度等的计算中具有一致的行为。

运算符优先级选择题

1. 以下表达式的结果是多少?

  1. 21
  2. 15
  3. 11
  4. 7
 

答案:C

解释:乘法 (*) 的优先级高于加法 (+)。所以,2 * 3 = 6,然后 5 + 6 = 11。


2. 以下哪个运算符的优先级最低?

  1. *
  2. +
  3. =
  4. &&
 

答案:C

解释:赋值运算符 = 的优先级最低。它在几乎所有其他运算符之后求值。


3. 此表达式的输出是什么?

  1. false
  2. true
  3. 编译错误
  4. 运行时异常
 

答案:B

解释:&& 比 || 先求值。首先 10 > 5 && 3 < 1 → true && false → false,然后 false || true → true。


4. 关于 Java 运算符结合性的以下哪个陈述是正确的?

  1. 所有运算符都是左结合的
  2. 所有运算符都是右结合的
  3. 所有运算符都是非结合的
  4. 有些运算符是左结合的,有些是右结合的
 

答案:D

解释:大多数运算符(如 +, *, &&)是左结合的,但有些(如 =,?:)是右结合的。


5. 如何覆盖表达式中默认的运算符优先级?

  1. 使用花括号 {}
  2. 使用分号
  3. 使用括号 ()
  4. 使用方括号 []
 

答案:C

解释:括号 () 用于定义求值顺序并明确覆盖默认优先级规则。