5

任何人都可以帮助我解决以下问题:

我有如下代码:

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

在这里,cond1 是昂贵的操作,其输出是布尔值。

现在我的问题是当 cond2 输出为假时 JAVAC 会做什么。具体来说,是评估 cond3 的输出还是停止评估?

更形象地说,

if(cond1 && cond2 && .. && cond10)
  //do this

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

在java中是否相同(在执行方式的情况下)?

4

8 回答 8

16

操作员&&总是短路。false仅当条件 1 和 2 为 时,才会评估条件 3 true

于 2012-04-17T16:55:30.420 回答
5

如果整个表达式是&&or||那么 Java 将使用短路评估。这意味着如果一切正常&&,它将在第一个 false 之后停止,如果一切正常||,它将在第一个 true 之后停止。

于 2012-04-17T16:56:00.963 回答
2

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

于 2012-04-17T16:55:24.150 回答
2

一旦发现其中一个值为假,Java 将立即退出该检查。

同样,一旦发现其中一个值为真,它就会使用 OR 执行您所期望的操作。

不需要评价其他的。

于 2012-04-17T16:56:23.877 回答
2

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

示例(伪代码)

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

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

于 2012-04-17T17:01:58.703 回答
1

直接回答:是的,它们本质上是一样的。

于 2012-04-17T16:56:00.257 回答
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 
于 2012-04-17T17:03:33.173 回答
1

&& 如果任何单个条件为假,则从左到右执行,条件将中断,整个条件为假。假设 cond2 为 false 则 cond3.. 其他将不会执行。另一方面,如果您使用 single & ,它将从左到右执行,直到处理的所有条件都不管是假还是真。这就是区别 && 将在第一个 false 时停止执行,并且 & 将继续到最后一个条件。

于 2012-04-17T17:07:51.377 回答