8

以下のプログラムでfunc3が実行されないのはなぜですか?func1の後、func2は評価される必要はありませんが、func3の場合は評価されるべきではありませんか?

if (func1() || func2() && func3()) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }
}

public static boolean func1() {
    System.out.println("func1");
    return true;
}

public static boolean func2() {
    System.out.println("func2");
    return false;
}

public static boolean func3() {
    System.out.println("func3");
    return false;
}
4

9 に答える 9

25

短絡またはを使用しています。最初の引数がtrueの場合、式全体がtrueになります。

コンパイラが使用する暗黙の括弧を追加すると役立つ場合があります

編集:Chris Jester-Youngが指摘したように、これは実際には論理演算子が左から右への結合性を持たなければならないためです。

if (func1() || (func2() && func3()))

func1が戻った後、次のようになります。

if (true || (func2() && func3()))

短絡またはを評価した後、次のようになります。

if (true)
于 2009-05-12T13:21:06.053 に答える
6

Java 関数は優先順位規則に従って評価されます

「&&」は「||」よりも優先順位が高いため、明示的な優先順位を設定する括弧がなかったため、最初に評価されます

だからあなたの表現

(A || B && C) 

これは

(T || F && F)

次のように括弧で囲まれています

(T || (F && F)) 

優先ルールがあるためです。

コンパイラは、'A == true' の場合、残りの式をわざわざ評価する必要がないことを理解しているため、A の評価後に停止します。

括弧で囲んだ場合((A || B) && C)、false と評価されます。

編集

他のポスターで言及されているように、別の方法は「|」を使用することです 「||」の代わりに「&」および「&&」は、式のショートカットを停止するためです。ただし、優先順位の規則により、最終結果は同じになります。

于 2009-05-12T13:28:40.530 に答える
3

Javaはブール式を短絡します。つまり、一度func1()実行されてが返されると、演算子trueを使用しているため、残りのブール値は重要ではありません。orfunc2() && func3()に評価されても、式全体はに評価されtrueます。func2()したがって、Javaはorを評価することすらしませんfunc3()

于 2009-05-12T13:20:48.173 に答える
2

http://en.wikipedia.org/wiki/Short-circuit_evaluation

于 2009-05-12T13:21:23.633 に答える
2

Java は遅延評価を使用します。

Func1 は常に true を返すため、式全体が true でなければならず、残りの式をショートカットします。

true || (???)

false && (???)

常にショートカットします。

ショートカットの評価をオフにするには、 | を使用します。および || の代わりに & と &&

これを効果的に使用できます。

String s;
if (s != null && !s.equals("")) ...

つまり、s が null の場合、s.equals を呼び出す必要さえなく、最終的に NullPointerException をスローすることもありません。

于 2009-05-12T13:23:30.117 に答える
2

ショートカット演算子 || を使用しています。と &&。結果がすでに定義されている場合、これらの演算子は残りの式を実行しません。|| について つまり、最初の式が true の場合と && の場合は最初の式が false の場合です。

式のすべての部分を実行したい場合は | を使用します。& 代わりに、それはショートカットではありません。

于 2009-05-12T13:25:00.583 に答える
1

簡単な答え:短絡評価

func1()はtrueであるため、常にtrueであるため、評価を続行する必要はありません。

于 2009-05-12T13:21:15.210 に答える
1

関数1が常にtrueを返す場合、Javaは、式全体がtrueになるかどうかを判断するために、式の残りの部分を評価する必要はありません。

于 2009-05-12T13:22:34.910 に答える
0

すべての機能を実行したい場合は、ショートカットバリアントをドロップできます

if (func1() | func2() & func3()) {
于 2009-05-12T18:37:44.480 に答える