14

ブロックを実行する必要がある場合は、次の両方の内容:

if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}

|では、使用と使用の違いは何||ですか?

注:これを調べたところ、以下に含めた独自の回答が見つかりました。私を訂正したり、独自の見解を述べたりしてください。確かに改善の余地があります!

4

5 に答える 5

40

両者は用途が異なります。多くの場合 (ブール値を扱う場合)、同じ効果があるように見えるかもしれませんが、論理 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 ステートメントは短絡ではないためエラーになり、ゼロによる除算が発生します。

于 2012-06-22T12:55:41.687 に答える
15

論理演算子はブール値で機能し、ビット演算子はビットで機能します。この場合、効果は同じになりますが、2 つの違いがあります。

  1. ビット単位の演算子はそのためのものではないため、読みにくくなりますが、最も重要なことは
  2. 論理 OR 演算子は、最初の条件を評価します。true の場合、次の条件がどうなるかは関係なく、結果は true になるため、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;
    }
}
于 2012-06-22T12:50:52.540 に答える
7

プログラマの場合、違いは 1 つだけです。

  1. 論理演算子は論理演算子です。つまり、1 つの条件のみをテストし、それに基づいて結果を取得します。

booleanFunction() || 関数 いずれかが true の場合、otherBooleanFunction()は true になります。同様に、booleanFunction() && otherBooleanFunction()は、どちらかが false の場合に false になります。では、なぜもう一方をテストするのでしょうか。それが論理演算子の機能です。

しかし、ビットごとのものは両方をチェックします。この概念の頻繁な適用は次のとおりです。

if(someObject != null && someObject.somemethod())

したがって、この場合、交換&&する場合&は、災害を待ちます。すぐに厄介な NullPointerException が発生します...

于 2012-06-22T13:00:09.673 に答える
4
if( booleanFunction() || otherBooleanFunction() ) {...}

この状態では、 booleanFunction()returnsのtrue場合はotherBooleanFunction()実行されません。

if( booleanFunction() | otherBooleanFunction() ) {...}

しかし、ビット演算子では、両方の関数booleanFunction()otherBooleanFunction()返されbooleanFunction()ますtruefalse

于 2012-06-22T12:57:44.110 に答える