2

可能重复:
Java 是否在布尔结果已知后评估剩余条件?

在 java 中执行具有多个&&语句的代码时,如果第一个解析为 false,编译器是否会继续解析额外的布尔比较?

if (1==2 && 3==4 && 4==5) { Do Something }

一旦确定1==2为假,编译器会立即跳出 if 语句,还是会继续解析3==44==5在之后继续解析?

4

7 回答 7

2

如果&&它检测到其中一个条件为假,它将停止评估。这称为短路评估

于 2012-10-08T06:26:40.713 回答
2

“编程语言中的短路评估”

在任何逻辑表达式的情况下most compiler stop evaluation expression as soon as result evaluated。它不仅在 Java 中,而且在几乎所有语言中。(但不是全部,例如 VB6)

您也可以按如下方式进行检查:

i = 0 , j =1;
我 && ++j;
system.out.print(" j=" + j);

的值j will be 1,表示++j 没有被执行。

于 2012-10-08T07:36:56.777 回答
1

如果第一个布尔比较解析为 false,编译器是否继续解析其他布尔比较

简短的回答。不!编译器javacJIT静态分析所有代码。像这样走捷径是不行的。例如,如果第二个条件没有编译,无论第一个条件如何,你总是会得到一个编译错误。

你可能想问的是;如果第一个或第二个条件是,程序会执行其他条件吗false?在这种情况下,它不会。

于 2012-10-08T06:29:10.470 回答
1

这对编译器没有任何影响——它所做的只是将布尔比较解析为机器代码,由一个或多个 .class 文件表示。

至于实际的运行时间......如果我在计算机科学课上没记错的话,Tarun 和 Lews 的答案都是正确的——一旦得到一个不正确的表达式,比较就会短路。

于 2012-10-08T06:29:37.310 回答
0

IF "1==2" 为假,编译器会立即跳出 if 语句。

于 2012-10-08T06:28:02.927 回答
0

&&

-以上是一个short-circuit AND operator。如果第一个条件结果为假,则不评估第二个条件。

例如:

if ((a==false) && (b==true)){


  }

以上将在第一次评估后停止

-如果您想强制评估这两个条件,请尝试Non-Short Circuit AND (&)

于 2012-10-08T06:30:16.007 回答
0

标题中关键字“效率”的旁注:-正如其他答案所述,您的基本问题很容易回答,因此这不是效率问题,而是如果您出于某种原因需要评估所有表达式的问题,例如执行更改状态的代码时(顺便说一句,这根本不是好的编码)。

但是,如果您从执行速度的角度考虑“效率”,那么您几乎不必在该级别上进行优化,编译器会为您完成,或者您不会注意到差异。在某些时间关键的操作或在非常大的循环中运行的操作中可能很重要,但在几乎所有其他情况下,编写干净的代码更为重要,以便其他人可以很好地阅读它。

于 2012-10-08T06:41:39.090 回答