Java- && Evaluation

5

大家好,请帮我解决以下问题:

我有如下代码:

if(cond1 && cond2 && .. && cond10)

在这里,cond1是一些昂贵的操作,其输出为布尔值。
现在我的问题是,当cond2的输出为false时,JAVAC会怎么做。具体而言,它会评估cond3的输出还是停止评估?
更形象地说,
if(cond1 && cond2 && .. && cond10)
  //do this

并且

if(cond1){
  if(cond2){
         .
         .
         .
        if(cond10){
             //do this
                   }

在Java中,如果执行方式相同,那么这两个东西是相同的吗?

两个代码片段是相同的,第一个代码片段的执行结果与第二个代码片段相同。 - Samir Mangroliya
当条件为false时,它将停止。此外,您应该首先放置最便宜的条件,因为如果任何一个条件失败,整个过程都会失败。如果不必要,为什么要检查昂贵的条件? - PaulG
@PaulG,这就是我问的原因,它是按LR方式还是RL方式评估的? - Arpssss
1
LR,而不是RL。所以最便宜的在左边。编辑:我将所有这些放在下面的答案中。 - PaulG
8个回答

16

&& 运算符总是在 false 时短路。只有在条件1和条件2都为true时,条件3才会被评估。


6

如果整个表达式是 &&||,那么Java将使用短路求值。这意味着如果所有的操作数都是 &&,它将在第一个 false 后停止执行;如果都是 ||,则在第一个 true 后停止执行。


谢谢。它是按照LR方式还是RL方式进行评估的? - Arpssss
3
如果你的意思是从左到右或者从右到左,那么它是从左到右计算的。 - twain249
1
这与“整个表达式”无关。这些运算符是单独短路评估的。 - user207421

2

是的,您的代码片段是等效的。Java中的逻辑AND运算符是短路的。


2

只要Java发现其中一个值是false,就会退出该检查。

同样地,如果Java发现其中一个值为true,它将按预期执行OR操作。

无需评估其他值。


2

一旦它遇到了false,它就会停止运行(这被称为短路逻辑)。在您的情况下,cond3将永远不会被评估。此外,条件从左到右进行评估,因此在左边放置最便宜的条件总是一个好主意。这将避免不必要地评估昂贵的条件。

示例(伪代码)

if(JohnIsMale && IsJohnsCholesterolTooHigh())
   {
   //Tell John to take it easy on the ice cream cause he could develop a heart condition
   }

不要先检查第二个条件,因为它需要计算。如果他不是男性(一个简单的真或假),你永远不必检查第二个条件。


1
回答直接的问题:是的,它们本质上是相同的。

1

它的工作原理类似于...

if(cond1){ //if its true then check con2 ,else exit
  if(cond2){//if its true then check con 3, else exit
       if(cond3){.....


and Both code snippets  are same 

1

&&将从左到右执行,如果任何一个条件为假,则该条件将被中断并且整个条件将为假。假设cond2为false,则cond3和其他条件将不会被执行。换句话说, 如果您使用单个&,它将从左到右执行,直到所有条件都处理完毕,无论是false还是true。这就是&&和&之间的区别,&&将在第一个false上停止执行,而&将继续执行直到最后一个条件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接