Java 中的最高优先级

2025 年 5 月 2 日 | 阅读 6 分钟

优先级是指表达式中运算符的求值顺序。理解运算符优先级对于编写正确有效的代码至关重要,因为它决定了表达式的求值方式。Java遵循一组规则来确定运算符的优先级,从而确保表达式以可预测且一致的方式求值。

Java 的运算符优先级是分层的,这意味着在求值表达式时,某些运算符优先于其他运算符。它对于确定表达式中操作的执行顺序至关重要。优先级较高的运算符在优先级较低的运算符之前求值。

基本运算符和优先级

Java 支持各种运算符,包括算术、关系、逻辑、赋值和位运算符。这些运算符具有不同的优先级级别,决定了它们的求值顺序。

Highest precedence in Java

算术运算符:算术运算符执行基本的数学运算,如加法、减法、乘法和除法。在 Java 中,算术运算符的优先级顺序为

  1. 一元运算符(+、-)
  2. 乘法 * 和除法 /
  3. 加法 + 和减法 -

括号的优先级最高,其次是一元运算符、乘法/除法,最后是加法/减法。

关系运算符:关系运算符用于比较值。它们包括 <、>、<=、>=、== 和 !=。关系运算符的优先级低于算术运算符。

逻辑运算符:逻辑运算符执行逻辑 AND、OR 和 NOT 操作。逻辑 AND 运算符 (&&) 的优先级高于逻辑 OR 运算符 (||),逻辑 OR 运算符的优先级又高于逻辑 NOT 运算符 (!)。

赋值运算符:赋值运算符(=、+=、-=)用于为变量赋值。它们的优先级低于算术、关系和逻辑运算符。

位运算符:位运算符操作操作数的单个位。它们包括 &、|、^、<<、>> 和 >>>。位运算符的优先级低于逻辑运算符。

下表定义了优先级。优先级最低的运算符显示在表的最上面。

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

优先级顺序

当两个运算符共享一个操作数时,优先级较高的运算符先执行。例如,x + y * z 被视为 x + (y * z),而 x * y + z 被视为 (x * y) + z,因为与 + 运算符相比,* 运算符具有更高的优先级。

结合性

结合性是一个与运算符在表达式中应用有关的概念。当表达式中出现两个具有相同优先级的运算符时,结合性概念非常有帮助。假设我们有一个表达式 a + b - c (+ 和 - 运算符具有相同的优先级),该表达式将被视为 (a + (b - c)),因为这些运算符是从右到左结合的。另一方面,a+++--b+c++ 将被视为 ((a++)+((--b)+(c++))),因为一元后置自增和自减运算符是从右到左结合的。

下面定义了一个示例,以了解如何使用优先级和结合性来求值表达式?

表达式:x = 4 / 2 + 8 * 4 - ( 5+ 2 ) % 3

解决方案

1) 在上述表达式中,优先级最高的运算符是 ()。所以,括号先计算。

x = 4 / 2 + 8 * 4 - 7 % 3

2) 现在,/、*% 运算符具有相同的优先级,并且高于 +-。在这里,我们使用结合性概念来解决它们。这些运算符的结合性是从左到右。因此,/ 运算符先执行,然后 *% 同时执行。

x = 2 + 8 * 4 - 7 % 3

x = 2 + 32 - 7 % 3

x = 2 + 32 - 1

3) 现在,+- 运算符都具有相同的优先级,并且这些运算符的结合性是从左到右。所以,+ 运算符先执行,然后 - 执行。

x = 34 - 1

x = 33

HighestPrecedence.java

输出

Highest precedence in Java

示例

1. 算术表达式

乘法运算符 * 的优先级高于加法运算符 +,因此首先求值 3 * 2,结果为 6。然后,求值 5 + 6,得到 11,并将其赋值给变量 result。

Example1.java

输出

Result: 11

2. 括号

在这种情况下,括号具有最高优先级。首先求值 5 + 3,结果为 8。然后,求值 8 * 2,得到 16。

Example2.java

输出

Result: 16

3. 逻辑表达式

关系运算符(>、<)的优先级高于逻辑运算符(&&)。首先求值两个关系表达式,分别得到 true 和 false。然后,执行逻辑 AND 操作,结果为 false。

Example3.java

输出

Result: false

使用括号覆盖优先级

虽然运算符优先级规定了默认的求值顺序,但我们可以使用括号来覆盖它。括号允许我们指定表达式中操作的执行顺序。通过将表达式的一部分括在括号中,我们可以确保它们被一起求值,而不管默认优先级如何。

优先级的重要性

理解运算符优先级对于编写正确有效的代码至关重要。错误的优先级可能导致意外行为或不正确的结果。通过遵循优先级规则,我们可以确保表达式按照预期顺序求值。

此外,了解优先级规则有助于编写简洁易读的代码。它允许我们在表达式中省略不必要的括号,使代码对其他开发人员来说更易于理解。