ブロックを実行する必要がある場合は、次の両方の内容:
if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}
|
では、使用と使用の違いは何||
ですか?
注:これを調べたところ、以下に含めた独自の回答が見つかりました。私を訂正したり、独自の見解を述べたりしてください。確かに改善の余地があります!
ブロックを実行する必要がある場合は、次の両方の内容:
if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}
|
では、使用と使用の違いは何||
ですか?
注:これを調べたところ、以下に含めた独自の回答が見つかりました。私を訂正したり、独自の見解を述べたりしてください。確かに改善の余地があります!
両者は用途が異なります。多くの場合 (ブール値を扱う場合)、同じ効果があるように見えるかもしれませんが、論理 OR はショート サーキットであることに注意することが重要です。未評価。ビットごとの演算子は、関係なく両方の引数を評価します。
同様に、論理 AND はショート サーキットです。つまり、最初の引数が 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);
最初の print ステートメントは正常に機能し、最初の引数が true に評価されるため true を返すため、評価が停止します。2 番目の print ステートメントは短絡ではないためエラーになり、ゼロによる除算が発生します。
論理演算子はブール値で機能し、ビット演算子はビットで機能します。この場合、効果は同じになりますが、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;
}
}
プログラマの場合、違いは 1 つだけです。
booleanFunction() || 関数 いずれかが true の場合、otherBooleanFunction()は true になります。同様に、booleanFunction() && otherBooleanFunction()は、どちらかが false の場合に false になります。では、なぜもう一方をテストするのでしょうか。それが論理演算子の機能です。
しかし、ビットごとのものは両方をチェックします。この概念の頻繁な適用は次のとおりです。
if(someObject != null && someObject.somemethod())
したがって、この場合、交換&&
する場合&
は、災害を待ちます。すぐに厄介な NullPointerException が発生します...
if( booleanFunction() || otherBooleanFunction() ) {...}
この状態では、 booleanFunction()
returnsのtrue
場合はotherBooleanFunction()
実行されません。
if( booleanFunction() | otherBooleanFunction() ) {...}
しかし、ビット演算子では、両方の関数booleanFunction()
がotherBooleanFunction()
返されbooleanFunction()
ますtrue
。false