web-dev-qa-db-ja.com

Javaでプログラミングする場合、短絡とは何ですか?

可能性のある複製:
Does Javaブール結果が判明した後、残りの条件を評価します
通常、なぜ||ない|、違いは何ですか?

先日クラスの講義に出席できなかったので、ショートサーキットとは何か、簡単なJavaプログラムでの使用例)について説明できる人がいるかどうか疑問に思いました。ご協力ありがとうございます。

21
user1214845

短絡とは、結果が決定されるとすぐに式の評価が停止されることです。たとえば:

_if (a == b || c == d || e == f) {
    // Do something
}
_

_a == b_がtrueの場合、式の結果はすでに決定されているため、_c == d_および_e == f_はまったく評価されないです。 _a == b_がfalseの場合、_c == d_が評価されます。 ifit'strueの場合、_e == f_は評価されません。これは何の違いもないように見えるかもしれませんが、以下を考慮してください:

_if (foo() || bar() || baz()) {
    // Do something
}
_

foo()がtrueを返す場合、式の結果はすでに決定されているため、barおよびbaz決して呼び出されないです。したがって、barまたはbazが単に何かを返す以外の効果がある場合(a副作用)、これらの効果は発生しません。

短絡の1つの素晴らしい例は、オブジェクト参照に関連しています。

_if (a != null && a.getFoo() != 42) {
    // Do something
}
_

a.getFoo()は通常、NullPointerExceptionaの場合、nullをスローしますが、式が短絡するため、_a != null_がfalseの場合、a.getFoo()の部分は発生しないため、ここでは行いません。 t例外が発生します。

すべての式が短絡しているわけではないことに注意してください。 _||_および_&&_演算子は省略されていますが、_|_および_&_は省略されておらず、_*_または_/_も省略されていません。実際、ほとんどのオペレーターはそうではありません。

47
T.J. Crowder

短絡回路評価 は、ブール式(論理ANDおよびOR)を評価するときに、式を満たすか否定する最初の条件を見つけたらすぐに停止できることを意味します。

たとえば、いくつかのサブ式を持つ論理ORを評価していて、それぞれの評価に非常にコストがかかるとします。

_if (costlyTest1() || costlyTest2() || costlyTest3()) { // ...
_

JVMは、trueを返す関数が見つかるとすぐに「costlyTest」関数の評価を停止できます。これは、ブール式を満たすためです。したがって、costlyTest1()がtrueを返す場合、他のテストはスキップされます。同様に:

_if (costlyTest1() && costlyTest2() && costlyTest3()) { // ...
_

JVMはfalseを返す関数が見つかるとすぐに関数の評価を停止できます。これは、式も満たすためです。したがって、costlyTest1()がfalseを返す場合、他の関数は呼び出されません。

これらのルールはブール式のネストのあらゆるレベルに関係し、上記の例で示されているように、不必要な作業を回避するために利用できます。

3
maerics

Short Circuit:最初の部分がtrueの場合、残りの式を評価する必要はありません。 &&の場合も同じロジックがfalseに適用されます。これも短絡です

2
Cratylus

式の評価を短絡するということは、その値を見つける前に式の一部のみを評価する必要があることを意味します。例えば:

_a == null || a.size() == 0
_

anullの場合、ブール演算子_||_がtrueに評価されるため、a.size() == 0部分式は評価されませんそのオペランドはtrueです。

同様に、この式の場合:

_a != null && a.size() > 0
_

anullの場合、ブール演算子_&&_はfalseのいずれかであると評価されるため、a.size() > 0は評価されませんそのオペランドはfalseです。

上記の例では、ブール演算子_&&_および_||_は、最初のオペランドの値が値を決定するのに十分である場合、2番目のオペランドが評価されない可能性があるという事実を考慮して、短絡と呼ばれます全体の表現の。比較のために、_&_および_|_オペランドは、同等の非短絡ブール演算子です。

0
Óscar López

ショートサーキットは、論理ANDまたはOR演算子(&または|)を使用する別の方法です。

例えば非短絡OR

if(false | true) {

}

最初の条件と2番目の条件は、falseがtrueでない場合(常にtrue)でも評価されます。

ただし、短絡ORとして記述されています。

if(false || true) {

}

最初の条件はfalseであるためにのみ評価され、trueは必須ではないため評価されません。

0
James Goodwin