17

条件演算子 && と || の両方
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.htmlに従って短絡されています。これは、2 番目のオペランドを時々評価する必要がないことを意味します。

誰かが条件付き OR(||) 演算子が短絡する例を教えてください。

短絡動作は、次のように条件付き AND(&&) 演算子を使用すると非常に簡単です。

if(false && (1 > 0)) の場合、2 番目のオペランド:(1 >0) を評価する必要はありませんが、条件付き OR の例を見つけたり考えたりすることはできません。

4

3 に答える 3

22

or 演算子は、最初のオペランドが true の場合に短絡されます。そう、

String foo = null;
if (true || foo.equals("")) {
    // ...
}

をスローしませんNullPointerException

@prajeesh がコメントで正しく指摘しているように、実際のコードでショートサーキットを使用する方法は、NullPointerExceptionnull を返す可能性のある API を扱うときはいつでも回避することです。したがって、たとえば、readStringFromConsole現在利用可能な文字列またはユーザーが何も入力しない場合は null を返すメソッドがある場合、次のように記述できます。

String username = readStringFromConsole();
while (username == null || username.length() == 0) {
    // No NullPointerException on the while clause because the length() call
    // will only be made if username is not null

    System.out.println("Please enter a non-blank name");
    username = readStringFromConsole();
}

// Now do something useful with username, which is non-null and of nonzero length

補足として、ユーザー入力を返す API は、ユーザーが何も入力しない場合は常に空の文字列を返す必要があり、null を返すべきではありません。null を返すことは「利用できるものがない」ことを示す方法ですが、空の文字列を返すことは「ユーザーが何も入力していない」ことを示す方法であるため、推奨されます。

于 2012-04-15T18:49:17.050 に答える
1
if(true || (0 > 1))

最初のステートメントは true であるため、2 番目のステートメントを評価する必要はありません。

于 2012-04-15T18:49:12.060 に答える
1
if (true || comparison)

その結果は無関係であるため (最初の引数が既に true であるため)、比較は評価されません。

于 2012-04-15T18:51:03.650 に答える