我开始使用Java,我遇到了一些不一致的问题。为什么这样做:
if ((d != 0) && (n / d < 3)) {
compute(a, d);
}
但如果我这样做:
if ((n / d < 3) && (d != 0)) {
compute(a, d);
}
我收到此错误:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at compute.main(compute.java:63)
答案 0 :(得分:23)
Java使用Short-Circuit Logic评估表达式。这意味着对于&&
,如果左表达式是false
,则Java不会考虑正确的表达式(因为整个表达式已经保证为假)。
在您的第一个示例中,如果d == 0
,则d != 0
为false,因此不会评估n / d
。在您的第二个示例中,如果d == 0
,则评估n / d < 3
将为您提供除以零错误。
答案 1 :(得分:5)
在您的第一个示例中,由于short circuit evaluation,在d == 0
时,编译器发现它不需要评估n/d
,因为false && true
仍然是假的
如果你改变条件,你最先评估n/d
,然后才知道d是否为零。你所造成的是一个错误,因为除以零。
答案 2 :(得分:3)
这不是一个不一致的问题。任何源自C语言(C ++,Java,许多其他语言)的语言都以这种方式运行(将&amp;&amp;和||运算符短路)。
如果您希望评估双方,请使用&amp;和| (vs&amp;&amp;和||)。