次のifブロックの両方の内容を実行する必要があります。
if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}
では、|
を使用することと||
を使用することの違いは何ですか?
注:私はこれを調べて、以下に含めた自分の答えを見つけました。お気軽に訂正するか、ご意見をお聞かせください。確かに改善の余地があります!
論理演算子はブール値で機能し、ビット演算子はビットで機能します。この場合、効果は同じになりますが、2つの違いがあります。
これを証明するための便利なコードを次に示します。
public class OperatorTest {
public static void main(String[] args){
System.out.println("Logical Operator:");
if(sayAndReturn(true, "first") || sayAndReturn(true, "second")){
//doNothing
}
System.out.println("Bitwise Operator:");
if(sayAndReturn(true, "first") | sayAndReturn(true, "second")){
//doNothing
}
}
public static boolean sayAndReturn(boolean ret, String msg){
System.out.println(msg);
return ret;
}
}
2つの用途は異なります。多くの場合(ブール値を処理する場合)、同じ効果があるように見える場合がありますが、論理ORは短絡であることに注意することが重要です。つまり、最初の引数がtrueと評価された場合、2番目の引数が残されます。未評価。ビット演算子は、関係なく両方の引数を評価します。
同様に、論理積は短絡です。つまり、最初の引数がfalseと評価された場合、2番目の引数は未評価のままになります。繰り返しますが、ビット単位のANDはそうではありません。
あなたはここでこれが実際に動いているのを見ることができます:
int x = 0;
int y = 1;
System.out.println(x+y == 1 || y/x == 1);
System.out.println(x+y == 1 | y/x == 1);
最初の引数がtrueと評価されるため、最初のprintステートメントは正常に機能し、trueを返します。したがって、評価は停止します。 2番目のprintステートメントは短絡ではないためエラーになり、ゼロによる除算が発生します。
プログラマーにとって、違いは1つだけです。
booleanFunction()|| otherBooleanFunction()いずれかがtrueの場合、trueになります。同様に、booleanFunction()&& otherBooleanFunction()のいずれかがfalseの場合、falseになります。だから、なぜ他のものをテストするのですか。それが論理演算子が行うことです。
しかし、ビット単位のものは両方をチェックします。この概念の頻繁な適用は次のとおりです。
if(someObject != null && someObject.somemethod())
したがって、この場合、&&
を&
に置き換えると、災害が発生するのを待ちます。すぐに厄介なNullPointerExceptionが発生します...
_if( booleanFunction() || otherBooleanFunction() ) {...}
_
この状態で、booleanFunction()
がtrue
を返すと、otherBooleanFunction()
は実行されません。
_if( booleanFunction() | otherBooleanFunction() ) {...}
_
ただし、ビット演算子では、booleanFunction()
とotherBooleanFunction()
の両方の関数が実行されます。booleanFunction()
はtrue
またはfalse
を返します。
ビット単位と論理演算子の違い-1。ビット単位の演算子はビットで機能しますが、論理演算子はステートメントで機能します。 2.ビット単位で&で表されますが、論理で&&で表されます。 3.ビット単位または|で表されます一方、論理またはは||で表されます。