Java中的条件评估过程[重复]

Posted

技术标签:

【中文标题】Java中的条件评估过程[重复]【英文标题】:Condition evaluation process in Java [duplicate] 【发布时间】:2013-07-29 05:35:55 【问题描述】:

假设我有以下条件:

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

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

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

【问题讨论】:

我猜是从左到右 :) 是的,其他将被忽略 【参考方案1】:

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

JLS 15.24:

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

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

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

【讨论】:

"除了赋值运算符="。赋值运算符的左操作数也在右操作数之前计算。 @sepp2k 如何评估:x=y=z+1;! 首先评估x,然后评估y,然后评估z,然后评估1,然后评估valueOfZ +1,然后评估y = resultOfZPlus1,然后评估x = resultOfAssigningY【参考方案2】:

来自JLS

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

【讨论】:

关联性与计算操作数的顺序无关。 @sepp2k 你说得对,我最好删除那部分【参考方案3】:
if ( myList == null || myList.isEmpty() || xomeX == someY )

是的,评价是从左到右!

如果第一个条件为真,则不评估下一个条件。这个概念称为短路评估。您可以在此here 上阅读更多信息。之前发布的类似 SO 问题是Java logical operator short-circuiting

【讨论】:

【参考方案4】:

1) 从左到右

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

【讨论】:

【参考方案5】:

每个运营商都有自己的precedence 和associativity。

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于Java中的条件评估过程[重复]的主要内容,如果未能解决你的问题,请参考以下文章

简单条件在bash中得到错误的评估结果[重复]

如何在javascript中评估语句if [重复]

MySQL游标存储过程条件显示重复记录

Python:AND评估的优化[重复]

有条件地从 Java 8 中的列表中删除元素 [重复]

Java 8 Streams过滤器延迟评估的意图[重复]