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中的条件评估过程[重复]的主要内容,如果未能解决你的问题,请参考以下文章