可能性のある複製:
Does Javaブール結果が判明した後、残りの条件を評価します
通常、なぜ||
ない|
、違いは何ですか?
先日クラスの講義に出席できなかったので、ショートサーキットとは何か、簡単なJavaプログラムでの使用例)について説明できる人がいるかどうか疑問に思いました。ご協力ありがとうございます。
短絡とは、結果が決定されるとすぐに式の評価が停止されることです。たとえば:
_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()
は通常、NullPointerException
がa
の場合、null
をスローしますが、式が短絡するため、_a != null
_がfalse
の場合、a.getFoo()
の部分は発生しないため、ここでは行いません。 t例外が発生します。
すべての式が短絡しているわけではないことに注意してください。 _||
_および_&&
_演算子は省略されていますが、_|
_および_&
_は省略されておらず、_*
_または_/
_も省略されていません。実際、ほとんどのオペレーターはそうではありません。
短絡回路評価 は、ブール式(論理AND
およびOR
)を評価するときに、式を満たすか否定する最初の条件を見つけたらすぐに停止できることを意味します。
たとえば、いくつかのサブ式を持つ論理OR
を評価していて、それぞれの評価に非常にコストがかかるとします。
_if (costlyTest1() || costlyTest2() || costlyTest3()) { // ...
_
JVMは、true
を返す関数が見つかるとすぐに「costlyTest」関数の評価を停止できます。これは、ブール式を満たすためです。したがって、costlyTest1()
がtrueを返す場合、他のテストはスキップされます。同様に:
_if (costlyTest1() && costlyTest2() && costlyTest3()) { // ...
_
JVMはfalse
を返す関数が見つかるとすぐに関数の評価を停止できます。これは、式も満たすためです。したがって、costlyTest1()
がfalseを返す場合、他の関数は呼び出されません。
これらのルールはブール式のネストのあらゆるレベルに関係し、上記の例で示されているように、不必要な作業を回避するために利用できます。
Short Circuit
:最初の部分がtrue
の場合、残りの式を評価する必要はありません。 &&
の場合も同じロジックがfalse
に適用されます。これも短絡です
式の評価を短絡するということは、その値を見つける前に式の一部のみを評価する必要があることを意味します。例えば:
_a == null || a.size() == 0
_
a
がnull
の場合、ブール演算子_||
_がtrue
に評価されるため、a.size() == 0
部分式は評価されませんそのオペランドはtrue
です。
同様に、この式の場合:
_a != null && a.size() > 0
_
a
がnull
の場合、ブール演算子_&&
_はfalse
のいずれかであると評価されるため、a.size() > 0
は評価されませんそのオペランドはfalse
です。
上記の例では、ブール演算子_&&
_および_||
_は、最初のオペランドの値が値を決定するのに十分である場合、2番目のオペランドが評価されない可能性があるという事実を考慮して、短絡と呼ばれます全体の表現の。比較のために、_&
_および_|
_オペランドは、同等の非短絡ブール演算子です。
ショートサーキットは、論理ANDまたはOR演算子(&または|)を使用する別の方法です。
例えば非短絡OR
if(false | true) {
}
最初の条件と2番目の条件は、falseがtrueでない場合(常にtrue)でも評価されます。
ただし、短絡ORとして記述されています。
if(false || true) {
}
最初の条件はfalseであるためにのみ評価され、trueは必須ではないため評価されません。