他の答えは演算子間の機能的な違いをカバーするのに良い仕事をしましたが、答えは今日存在するほぼすべてのC派生言語に適用できます。質問はタグ付けされていますjava、そして私はJava言語について具体的かつ技術的に答えるように努めます。
&そして、|整数ビット演算子、またはブール論理演算子のいずれかになります。ビット演算子と論理演算子(§15.22)の構文は次のとおりです。
AndExpression:
EqualityExpression
AndExpression & EqualityExpression
ExclusiveOrExpression:
AndExpression
ExclusiveOrExpression ^ AndExpression
InclusiveOrExpression:
ExclusiveOrExpression
InclusiveOrExpression | ExclusiveOrExpression
構文EqualityExpressionで定義されている§15.21必要、RelationalExpressionで定義された§15.20順番に必要、ShiftExpressionとReferenceTypeで定義された§15.19と§4.3それぞれ。§15.18で定義されているShiftExpression必要があります。これは、ドリルダウンを続け、基本的な算術、単項演算子などを定義します。型を表すさまざまな方法すべてにドリルダウンします。(ながらプリミティブ型を含まない、それらが配列のディメンションタイプであってもよいように、プリミティブ型の定義は、最終的に、必要とされるです。)AdditiveExpressionReferenceTypeReferenceTypeReferenceType
ビット演算子と論理演算子には次のプロパティがあります。
- これらの演算子の優先順位は異なり、優先順位
&が最も高く、優先順位|が最も低くなります。
- これらの各演算子は構文的には左結合です(各グループは左から右へ)。
- オペランド式に副作用がない場合、各演算子は可換です。
- 各演算子は結合的です。
- ビット演算子と論理演算子を使用して、数値型の2つのオペランドまたは型の2つのオペランドを比較できます
boolean。他のすべての場合は、コンパイル時エラーになります。
演算子がビット演算子として機能するか論理演算子として機能するかは、オペランドが「プリミティブ整数型に変換可能」であるか(§4.2)、または型であるbooleanかBoolean(§5.1.8)によって異なります。
オペランドが整数型の場合、2つの数値の昇格(§5.6.2)が両方のオペランドに対して実行され、両方とも演算longのsまたはints として残されます。演算のタイプは、(昇格された)オペランドのタイプになります。その時点で、&ビットごとのAND、^ビットごとの排他的OR、|ビットごとの包含ORになります。(§15.22.1)
オペランドがある場合booleanやBoolean、(必要であれば、オペランドはアンボクシング変換の対象となる5.1.8)、及び操作の種類になりますboolean。&なりtrue、両方のオペランドがある場合はtrue、^になりますtrue両方のオペランドが異なる場合、および|になりtrueどちらかのオペランドがある場合true。(§15.22.2)
対照的に、 &&は「条件付きAND演算子」(§15.23)および||「条件付きOR演算子」(§15.24)です。それらの構文は次のように定義されています。
ConditionalAndExpression:
InclusiveOrExpression
ConditionalAndExpression && InclusiveOrExpression
ConditionalOrExpression:
ConditionalAndExpression
ConditionalOrExpression || ConditionalAndExpression
&&は&、左のオペランドがの場合にのみ右のオペランドを評価することを除いて、に似ていtrueます。||は|、左のオペランドがの場合にのみ右のオペランドを評価することを除いて、に似ていfalseます。
条件付きおよび以下のプロパティがあります。
- 条件付きAND演算子は構文的には左結合です(左から右にグループ化されます)。
- 条件演算子ANDは、副作用と結果値の両方に関して完全に関連付けられています。すなわち、任意の式のために
a、bおよびc、式の評価は、((a) && (b)) && (c)同じ副作用が発現の評価として、同じ順序で発生して、同じ結果を生成します(a) && ((b) && (c))。
- 条件付きAND演算子の各オペランドは
booleanor 型である必要があります。そうしないとBoolean、コンパイル時エラーが発生します。
- 条件式のタイプは常に
booleanです。
- 実行時には、左側のオペランド式が最初に評価されます。結果がtypeの場合、
Booleanボックス化解除の対象になります(§5.1.8ます)。
- 結果の値がの場合、
false条件付きAND式の値はfalse AND式あり、右側のオペランド式は評価されません。
- 左側のオペランドの値がの場合、
true右側の式が評価されます。結果がtypeの場合、Booleanボックス化解除の対象になります(§5.1.8ます)。結果の値は、条件式と式の値になります。
- したがって、オペランド
&&と同じ結果を計算&しbooleanます。これは、右側のオペランド式が常にではなく条件付きで評価されるという点でのみ異なります。
Conditional-Orには次のプロパティがあります。
- 条件付きOR演算子は構文的に左結合です(左から右にグループ化されます)。
- 条件付きOR演算子は、副作用と結果値の両方に関して完全に関連付けられています。すなわち、任意の式のために
a、bおよびc、式の評価は、((a) || (b)) || (c)同じ副作用が発現の評価として、同じ順序で発生して、同じ結果を生成します(a) || ((b) || (c))。
- 条件付きOR演算子の各オペランドは、タイプ
booleanor Booleanでなければなりません。そうでないと、コンパイル時エラーが発生します。
- 条件式または式のタイプは常に
booleanです。
- 実行時には、左側のオペランド式が最初に評価されます。結果がtypeの場合、
Booleanボックス化解除の対象になります(§5.1.8)。
- 結果の値がの場合、
true条件付きtrueOR式の値はであり、右側のオペランド式は評価されません。
- 左側のオペランドの値がの場合、
false右側の式が評価されます。結果がtypeの場合、Booleanボックス化解除の対象になります(§5.1.8ます)。結果の値は、条件式または式の値になります。
- したがって、on またはoperands
||と同じ結果を計算します。これは、右側のオペランド式が常にではなく条件付きで評価されるという点でのみ異なります。|booleanBoolean
要するに、として@JohnMeagher繰り返しコメント欄で指摘している&と|され、実際には、あるいずれかのオペランドの特定の場合にブール演算子を非短絡booleanまたはBoolean。良い慣行(つまり、二次的影響がない)では、これは小さな違いです。ただし、オペランドがbooleansではない場合、Boolean演算子の動作は大きく異なります。ビット単位の論理演算と論理演算は、Javaプログラミングの高レベルではうまく比較できません。