重複の可能性:
&と&&の違い
if (true && true) {
System.out.println("test if");
}
if (true & true) {
System.out.println("test if");
}
両方とも同じ出力を提供します。なぜですか?
&&
短絡しますが、そうで&
はありません。例:
if (methodA() && methodB()) {
...
}
その場合、methodA
既に false を返している場合methodB
は呼び出されません。正式には、式がある場合a && b
、b
は に評価された場合にのみ評価a
されtrue
ます。
明らかなパフォーマンス上の利点とは別に、これはnull
チェックに特に役立ちます。
if (x != null && x.getSomeValue()) {
...
}
&
ここでas single を使用すると、 x.getSomeValue()
was であっても評価され、例外x
が発生します。null
最初のケースでは、 if の 2 番目の部分をテストしません。&&
演算子は左から右に実行され、最初のfalse
値で停止します。
これは、次の場合に役立ちます。
if (a!=null && a.doSomething()==23) {
nullPointerException を防ぐためです。
ブール条件をテストするときは、常に を使用します&&
。
参照してください: http://www.jguru.com/faq/view.jsp?EID=16530
引数の種類によって異なります...
整数引数の場合、単一のアンパサンド (「&」) は「ビット単位の AND」演算子です。2 つのアンパサンド ("&&") は、2 つのブール引数以外には定義されていません。
ブール引数の場合、1 つのアンパサンドは (無条件の) 「論理 AND」演算子を構成し、2 つのアンパサンド (「&&」) は「条件付き論理 AND」演算子を構成します。つまり、1 つのアンパサンドは常に両方の引数を評価しますが、2 つのアンパサンドは最初の引数が true の場合にのみ 2 番目の引数を評価します。
他のすべての引数の型と組み合わせについては、コンパイル時エラーが発生するはずです。
& ステートメントでは、ステートメントの左側と右側の両方をチェックします。&& では、ステートメントの片側のみをチェックします (片側が true の場合、反対側はチェックしません)。
&& は論理積です
したがって、両方のステートメントが true になるようにする必要があります。
& はビットごとの AND 演算子です
ここを見てください:
&& は論理積です。true && true は true で、それ以外はすべて false です。& はビット単位の and です。(10 & 8) = 8