5

私は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)
4

3 に答える 3

23

Java はShort-Circuit Logicを使用して式を評価します。これが意味することは、 for&&の場合、左の式がfalseである場合、Java は右の式をわざわざ評価しないということです (式全体がすでに false であることが保証されているため)。

最初の例では、 if d == 0, thend != 0が false であるため、評価されませんn / d。2番目の例では、 ifd == 0を評価n / d < 3すると、ゼロ除算エラーが発生します。

于 2013-06-22T18:29:09.363 に答える
5

あなたの最初の例では、短絡評価のためd == 0、コンパイラは評価する必要がないことを判断します。n/dfalse && true

n/d条件を逆にすると、d がゼロかどうかを知る前に、最初に評価することになります。あなたが引き起こすのは、ゼロ除算によるエラーです。

于 2013-06-22T18:31:08.020 に答える