如果其中一个函数未返回 true,java 是否会在运行时实际调用所有三个函数?
通常出于调试目的,我喜欢在调试器中查看这些条件检查的结果,并将它们放在一行中会使这变得更加困难。如果有六次检查,那么代码就会变得更加难以阅读。
boolean result1 = CheckSomething();
boolean result2 = CheckSomethingElse();
boolean result3 = CheckSomeOtherThing();
boolean finalResult = result1 && result2 && result3;
如果 Java 不在运行时优化这个条件,那么通过编写这样的代码应该可以获得更好的性能,但代价是无法轻松地在调试器中看到中间值。
boolean finalResult = CheckSomething() && CheckSomethingElse() && CheckSomeOtherThing();
最佳答案
一般来说您的代码片段并不等效。第一个版本的行为必须就像调用所有函数,因为您在代码中无条件调用它们。
代码的第二个版本:
boolean finalResult = CheckSomething() && CheckSomethingElse() && CheckSomeOtherThing();
不等价,因为&&
操作是快捷方式,因此如果有任何返回false,则不会调用其余函数。
在解释器中运行时,您可以预期代码的第一个版本将实际调用所有方法。
现在,有趣的部分:代码编译后,编译器现在能够“查看”各种函数,确定它们是纯函数,没有副作用,并且可以编译两个版本完全相同。事实上,如果函数非常简单,最好编译两个版本以始终调用所有三个函数,因为组合三个 boolean 结果并检查一次可能是如果任何结果是不可预测的,速度会快得多。
编译器可能并不总是能够确定函数是否有副作用,或者实际上可能存在只有您知道无关紧要的副作用(例如,您知道不会发生但编译器可以发生的 ArrayOutOfBoundsException不证明)。因此,通常最好编写第二种形式,它允许编译器使用短路求值,无论它能够证明函数的什么内容。
关于java - Java 是否会优化函数调用以消除运行时不必要的 boolean 比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40664859/