Javaの&&
演算子は、両方のブールオペランドがtrue
であるかどうかを確認するために使用され、&
演算子は2つの整数型でビット演算を行うために使用されると常に考えていました。
最近、&
演算子を使用して、両方のブールオペランドがtrue
であるかどうかを確認できることを知りました。唯一の違いは、LHSオペランドがfalseであってもRHSオペランドをチェックすることです。
Javaの&
演算子は内部的にオーバーロードされていますか?または、この背後に他の概念がありますか?
&<-両方のオペランドを検証します
&& <-結果が偽になるため、最初のオペランドが偽と評価された場合、評価を停止します。
(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
を評価し、||
を実行することを意味します。
両方のオペランドを評価することで怠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
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
引数のタイプに依存します...
整数の引数の場合、単一のアンパサンド( "&")は「ビット単位のAND」演算子です。二重アンパサンド( "&&")は、2つのブール引数以外には定義されていません。
ブール引数の場合、単一のアンパサンドは(無条件の)「論理AND」演算子を構成し、二重アンパサンド(「&&」)は「条件付き論理AND」演算子です。つまり、1つのアンパサンドは常に両方の引数を評価しますが、ダブルアンパサンドは最初の引数がtrueの場合にのみ2番目の引数を評価します。
他のすべての引数タイプと組み合わせについては、コンパイル時エラーが発生するはずです。
&&は短絡演算子ですが、&はAND演算子です。
これを試して。
String s = null;
boolean b = false & s.isEmpty(); // NullPointerException
boolean sb = false && s.isEmpty(); // sb is false
私の答えはもっと理解できると思います:
&
と&&
には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
JLS(15.22.2) で指定されているとおりです。
&、^、または|の両方のオペランドが演算子はブール型またはブール型であり、ビットごとの演算子式の型はブール型です。すべての場合において、オペランドは必要に応じてアンボックス化変換(§5.1.8)の対象となります。
&の場合、両方のオペランド値がtrueの場合、結果値はtrueです。それ以外の場合、結果は偽です。
^の場合、オペランド値が異なる場合、結果値はtrueです。それ以外の場合、結果は偽です。
|では、両方のオペランド値がfalseの場合、結果値はfalseです。それ以外の場合、結果はtrueです。
「トリック」は、&
が整数ビット演算子およびブール論理演算子。なぜそうではないのか、これをoperator overloadingの例として見るのが妥当です。
「&&」:-論理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
ブール値では、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
特に多くのブール式または複雑な引数を実行する場合は、手順、処理、コーディングの改善。
&&
および||
は、短絡演算子と呼ばれます。 ||
で使用される場合-最初のオペランドがtrue
に評価される場合、残りのオペランドは評価されません。 &&
の場合-最初のオペランドがfalse
に評価される場合、それらの残りはまったく評価されません。
したがって、この例のif (a || (++x > 0))
は、aがtrue
であった場合、変数xはインクリメントされません。
&&および||に加えて短絡しているため、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
&は、両方の条件を評価する必要がある場合があるため、両方の条件のチェックに使用されるビット単位演算子です。ただし、&&論理演算子は、最初の条件が真の場合に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 if
first
引数はnot suffice
からdetermine
にvalue
をexpression
する