web-dev-qa-db-ja.com

Javaの&と&&の違いは何ですか?

Javaの&&演算子は、両方のブールオペランドがtrueであるかどうかを確認するために使用され、&演算子は2つの整数型でビット演算を行うために使用されると常に考えていました。

最近、&演算子を使用して、両方のブールオペランドがtrueであるかどうかを確認できることを知りました。唯一の違いは、LHSオペランドがfalseであってもRHSオペランドをチェックすることです。

Javaの&演算子は内部的にオーバーロードされていますか?または、この背後に他の概念がありますか?

141
Lavneesh

&<-両方のオペランドを検証します
&& <-結果が偽になるため、最初のオペランドが偽と評価された場合、評価を停止します。

(x != 0) & (1/x > 1) <-これは、(x != 0)を評価してから(1/x > 1)を評価してから&を実行することを意味します。問題は、x = 0の場合、例外がスローされることです。

(x != 0) && (1/x > 1) <-これは(x != 0)を評価することを意味し、これがtrueの場合にのみ(1/x > 1)を評価するため、x = 0の場合、これは完全に安全であり、(x! (1/x > 1)を評価せずにfalseと評価します。

編集:

exprA | exprB <-これは、exprAを評価してからexprBを評価してから|を実行することを意味します。

exprA || exprB <-これはexprAを評価し、これがfalseである場合にのみexprBを評価し、||を実行することを意味します。

240
ITroubs

両方のオペランドを評価することで怠zyな評価者ではないことに加えて、ビット演算子の主な特徴は、次の例のようにオペランドの各バイトを比較すると思います。

int a = 4;
int b = 7;
System.out.println(a & b); // prints 4
//meaning in an 32 bit system
// 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00000111
// ===================================
// 00000000 00000000 00000000 00000100
46
suat
boolean a, b;

Operation     Meaning                       Note
---------     -------                       ----
   a && b     logical AND                    short-circuiting
   a || b     logical OR                     short-circuiting
   a &  b     boolean logical AND            not short-circuiting
   a |  b     boolean logical OR             not short-circuiting
   a ^  b     boolean logical exclusive OR
  !a          logical NOT

short-circuiting        (x != 0) && (1/x > 1)   SAFE
not short-circuiting    (x != 0) &  (1/x > 1)   NOT SAFE
29
Torres

引数のタイプに依存します...

整数の引数の場合、単一のアンパサンド( "&")は「ビット単位のAND」演算子です。二重アンパサンド( "&&")は、2つのブール引数以外には定義されていません。

ブール引数の場合、単一のアンパサンドは(無条件の)「論理AND」演算子を構成し、二重アンパサンド(「&&」)は「条件付き論理AND」演算子です。つまり、1つのアンパサンドは常に両方の引数を評価しますが、ダブルアンパサンドは最初の引数がtrueの場合にのみ2番目の引数を評価します。

他のすべての引数タイプと組み合わせについては、コンパイル時エラーが発生するはずです。

10
developer

&&は短絡演算子ですが、&はAND演算子です。

これを試して。

    String s = null;
    boolean b = false & s.isEmpty(); // NullPointerException
    boolean sb = false && s.isEmpty(); // sb is false
9

私の答えはもっと理解できると思います:

&&&には2つの違いがあります。

論理ANDとして使用する場合

&および&&は論理的なANDにすることができます。&または&&の左と右の式の結果がすべてtrueの場合、演算結果全体がtrueになります。

&&&が論理ANDの場合、違いがあります。

&&を論理ANDとして使用する場合、左の式の結果がfalseの場合、右の式は実行されません。

例を見てみましょう:

String str = null;

if(str!=null && !str.equals("")){  // the right expression will not execute

}

&を使用する場合:

String str = null;

if(str!=null & !str.equals("")){  // the right expression will execute, and throw the NullPointerException 

}

他の例:

int x = 0;
int y = 2;
if(x==0 & ++y>2){
    System.out.print(“y=”+y);  // print is: y=3
}

int x = 0;
int y = 2;
if(x==0 && ++y>2){
    System.out.print(“y=”+y);  // print is: y=2
}

&はビット演算子として使用できます

&はBitwise AND演算子として使用できますが、&&は使用できません。

ビット単位のAND "&"演算子は、オペランドの両方のビットが1の場合にのみ1を生成します。ただし、両方のビットが0であるか、両方のビットが異なる場合、この演算子は0を生成します。 AND "&"演算子は、2つのビットのいずれかが1の場合は1を返し、いずれかのビットが0の場合は0を返します。

Wikiページから:

http://www.roseindia.net/Java/master-Java/java-bitwise-and.shtml

7
aircraft

JLS(15.22.2) で指定されているとおりです。

&、^、または|の両方のオペランドが演算子はブール型またはブール型であり、ビットごとの演算子式の型はブール型です。すべての場合において、オペランドは必要に応じてアンボックス化変換(§5.1.8)の対象となります。

&の場合、両方のオペランド値がtrueの場合、結果値はtrueです。それ以外の場合、結果は偽です。

^の場合、オペランド値が異なる場合、結果値はtrueです。それ以外の場合、結果は偽です。

|では、両方のオペランド値がfalseの場合、結果値はfalseです。それ以外の場合、結果はtrueです。

「トリック」は、&整数ビット演算子およびブール論理演算子。なぜそうではないのか、これをoperator overloadingの例として見るのが妥当です。

5
Andreas_D

「&&」:-論理AND演算子は、引数の論理関係に基づいてtrueまたはfalseのブール値を生成します。

例:-Condition1 && Condition2

Condition1がfalseの場合、(Condition1 && Condition2)は常にfalseになります。これが、この論理演算子が別の条件を評価しないため、短絡演算子とも呼ばれる理由です。 Condition1がfalseの場合、Condtiton2を評価する必要はありません。

Condition1がtrueの場合、Condition2が評価され、trueの場合、全体の結果はtrueになり、そうでない場合はfalseになります。

「&」:-ビット単位のAND演算子です。入力ビットが両方とも1の場合、出力に1が生成されます。それ以外の場合は、ゼロ(0)が生成されます。

例えば:-

int a = 12; // 12のバイナリ表現は1100です

int b = 6; // 6のバイナリ表現は0110

int c =(a&b); //(12&6)のバイナリ表現は0100

Cの値は4です。

参照については、これを参照してください http://techno-terminal.blogspot.in/2015/11/difference-between-operator-and-operator.html

4
satish

ブール値では、2つの間に出力の違いはありません。 &&および&または||を交換できますと|そして、それはあなたの表現の結果を決して変えません。

違いは、情報が処理されている舞台裏にあります。 a = 0およびb = 1の式「(a!= 0)&(b!= 0)」を右にすると、次のことが起こります。

left side: a != 0 --> false
right side: b 1= 0 --> true
left side and right side are both true? --> false
expression returns false

A = 0およびb = 1のときに式(a != 0) && ( b != 0)を記述すると、次のことが起こります。

a != 0 -->false
expression returns false

特に多くのブール式または複雑な引数を実行する場合は、手順、処理、コーディングの改善。

3
Ryan

&&および||は、短絡演算子と呼ばれます。 ||で使用される場合-最初のオペランドがtrueに評価される場合、残りのオペランドは評価されません。 &&の場合-最初のオペランドがfalseに評価される場合、それらの残りはまったく評価されません。

したがって、この例のif (a || (++x > 0))は、aがtrueであった場合、変数xはインクリメントされません。

3
ACV

&&および||に加えて短絡しているため、2つの形式を混在させる場合は演算子の優先順位も考慮してください。 result1とresult2に異なる値が含まれていることは、誰にとってもすぐにはわからないと思います。

boolean a = true;
boolean b = false;
boolean c = false;

boolean result1 = a || b && c; //is true;  evaluated as a || (b && c)
boolean result2 = a  | b && c; //is false; evaluated as (a | b) && c
3
mgr326639

&は、両方の条件を評価する必要がある場合があるため、両方の条件のチェックに使用されるビット単位演算子です。ただし、&&論理演算子は、最初の条件が真の場合に2番目の条件に進みます。

すべての回答はgreatであり、noの回答はis neededのようですが、&&演算子と呼ばれるdependent condition演算子について何かを指摘したかっただけです

演算子&&を使用する式では、条件(これをdependent conditionと呼びます)では、依存条件の評価が意味を持つために別の条件がtrueである必要があります。

この場合、エラーを防ぐために、&&演算子の後に依存条件を配置する必要があります。

(i != 0) && (10 / i == 2)を検討してください。依存条件(10 / i == 2)は、ゼロによる除算の可能性を防ぐためにappear after演算子&&でなければなりません。

別の例(myObject != null) && (myObject.getValue() == somevaluse)

そして別のこと:&&||短絡評価 と呼ばれます。なぜなら、2番目の引数が実行または評価されるからですonly iffirst引数はnot sufficeからdeterminevalueexpressionする

参照: Java™How To Program(初期オブジェクト)、第10版

0