首页 课程 师资 教程 报名

Java运算符优先级详解

  • 2022-05-05 11:23:59
  • 1100次 动力节点

Java 有明确定义的表达式求值规则,包括运算符优先级、运算符关联性和操作数求值顺序。我们描述了这三个规则中的每一个。

运算符优先级。 Java运算符优先级指定操作数与运算符分组的方式。例如,1 + 2 * 3 被视为 1 + (2 * 3),而 1 * 2 + 3 被视为 (1 * 2) + 3,因为乘法运算符的优先级高于加法运算符。您可以使用括号来覆盖默认的运算符优先规则。

运算符关联性。 当一个表达式有两个优先级相同的运算符时,运算符和操作数会根据它们的关联性进行分组。例如72 / 2 / 3被视为 (72 / 2) / 3因为除法运算符是从左到右的关联。您可以使用括号来覆盖默认的运算符关联性规则。

大多数 Java 运算符都是从左到右关联的。一个值得注意的例外是赋值运算符,它是从右到左结合的。结果,表达式x = y = z = 17被视为x = (y = (z = 17)),所有三个变量的值都为 17。回想一下,赋值语句的值是它的右-手边。关联性与某些运算符无关。例如, x <= y <= z和x++--在 Java 中是无效的表达式。

Java 运算符的优先级和关联性。 下表显示了所有 Java 运算符从最高到最低优先级,以及它们的关联性。大多数程序员不会全部记住它们,即使是那些记住的,为了清楚起见,也使用括号。

等级 操作员 描述 关联性
16 ()
[]
括号
数组访问
成员访问
左到右
15 ++
--
一元后增量
一元后减
左到右
14 +
-

~
++
--
一元加
一元减
一元逻辑非
一元按位非
一元预递增
一元预递减
右到左
13 ()
新的
铸造
对象创建
右到左
12 * / % 乘法的 左到右
11 + -
+
附加
字符串连接
左到右
10 << >>
>>>
转移 左到右
9 < <=
> >=
instanceof
关系 左到右
8 ==
!=
平等 左到右
7 & 按位与 左到右
6 ^ 按位异或 左到右
5 | 按位或 左到右
4 && 逻辑与 左到右
3 || 逻辑或 左到右
2 ?: 三元 右到左
1 = += -=
*= /= %=
&= ^= |=
<<= >>= >>>=
任务 右到左
0 -> lambda 表达式箭头 右到左

您会在网络和教科书中找到不同的(通常是等效的)运算符优先级表。它们通常以无关紧要的方式不同意,因为某些运算符不能共享操作数,因此它们的相对优先顺序无关紧要(例如,new和!)。Java 语言规范中没有明确的运算符优先级表。相反,运算符优先级和关联性规则是通过定义 Java 语言的语法来推断的。

Java中操作数求值的顺序。 关联性和优先级决定了 Java 对操作数和运算符的分组顺序,但它不决定操作数的计算顺序。在 Java 中,运算符的操作数总是从左到右计算。同样,参数列表总是从左到右计算。因此,例如在表达式 A() + B() * C(D(), E())中,子表达式按A()、B()、 D()、E()和C()。虽然C()出现在D()和E()的左侧,但我们需要D()和E()来评估C()。编写依赖于这种行为的代码被认为是糟糕的风格(并且不同的编程语言可能使用不同的规则)。

短路评估。 除了三个例外(&&、||和?:),Java 在执行操作之前评估运算符的每个操作数。对于逻辑 AND ( &&) 和逻辑 OR ( ||) 运算符,Java 仅在需要解析结果时才评估第二个操作数。这称为短路评估。它允许 if ((s != null) && (s.length() < 10))之类的语句可靠地工作(即,仅当 is not时才调用该length()方法)。程序员很少使用带有布尔表达式的非短路版本(&和|) 。snull

运算符优先级出错了。 有时,一种语言中定义的优先顺序不符合数学规范。例如,在 Microsoft Excel 中, -a^b被视为(-a)^b而不是 -(a^b). 所以-3^2计算结果为 9而不是-9,这是大多数数学家所期望的值。微软承认这种 怪癖 是一种“设计选择”。有人想知道程序员是否依赖于 C 优先顺序,其中一元运算符的优先级高于二元运算符。此规则与所有 C 运算符的数学约定一致,但由于添加了幂运算符而失败。一旦在 Microsoft Excel 2.0 中建立了订单,就很难在不破坏向后兼容性的情况下对其进行更改。

运算符关联性出错。 有时,运算符的关联性在一种编程语言中是从左到右实现的,而在另一种编程语言中是从右到左实现的。一个令人震惊的例子 是求幂。在 Wolfram Alpha 和 Google Sheets 中,取幂运算符是从右到左关联的,因此2 ^ 2 ^ 3被视为2 ^ (2 ^ 3),即 256。但是,在 Matlab 和 Excel 中,取幂运算符是从左到右关联的,因此 2 ^ 2 ^ 3被视为(2 ^ 2) ^ 3,即 64。求幂不是 Java 中的二元运算符。

以上就是关于“Java运算符优先级详解”的介绍,大家如果想了解更多相关知识,可以关注一下动力节点的Java在线学习,里面的课程内容从入门到精通,通俗易懂,比较适合没有基础的小伙伴学习,希望对大家能够有所帮助哦。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交