17

假设我有以下条件:

if ( myList == null || myList.isEmpty() || xomeX == someY )

这些条件的评估顺序是什么?每次向左还是向右,从右向左还是随机?

如果第一个通过,那么其他的就被忽略了吗?

4

6 回答 6

27

除了赋值运算符之外,它应该始终从左到右=。您正在使用 short circuit ORoperator ,因此如果第一个条件是true,则不会评估其余条件。

JLS 15.24

条件或运算符在语法上是左结合的(它从左到右分组)。

在运行时,首先计算左边的操作数表达式;如果结果具有布尔类型,则将进行拆箱转换(第 5.1.8 节)。

如果结果值为真,则条件或表达式的值为真,并且不计算右侧操作数表达式。

于 2013-07-29T12:21:56.020 回答
7
if ( myList == null || myList.isEmpty() || xomeX == someY )

是的,评价是从左到右!

如果第一个条件为真,则不评估下一个条件。这个概念称为短路评估。您可以在此处阅读更多信息。之前发布的类似 SO 问题是Java 逻辑运算符短路

于 2013-07-29T12:34:27.460 回答
7

来自JLS

在运行时,首先计算左侧操作数表达式 [...] 如果结果值为真,则条件或表达式的值为真,并且不计算右侧操作数表达式。

于 2013-07-29T12:23:19.390 回答
3

1) 从左到右

2) 在这种情况下,如果一个条件为真,则不会评估其余条件。所以如果myList为空,它不会引发NullPointerException评估myList.isEmpty()(因为它不会评估它)

于 2013-07-29T12:21:51.610 回答
1

每个运算符都有自己的优先级关联性

这些链接足以回答您的问题。

于 2013-07-29T12:44:54.670 回答
0

|| 是短路或运算符,这意味着从左到右严格评估条件,并且此检查过程在第一个真实结果时停止。

于 2013-07-29T12:28:29.837 回答