更新时间:2022-05-05 11:23:59 来源:极悦 浏览1302次
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极悦在线学习,里面的课程内容从入门到精通,通俗易懂,比较适合没有基础的小伙伴学习,希望对大家能够有所帮助哦。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习