他の答えは演算子間の機能的な違いをカバーするのに良い仕事をしましたが、答えは今日存在するほぼすべての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
必要があります。これは、ドリルダウンを続け、基本的な算術、単項演算子などを定義します。型を表すさまざまな方法すべてにドリルダウンします。(ながらプリミティブ型を含まない、それらが配列のディメンションタイプであってもよいように、プリミティブ型の定義は、最終的に、必要とされるです。)AdditiveExpression
ReferenceType
ReferenceType
ReferenceType
ビット演算子と論理演算子には次のプロパティがあります。
- これらの演算子の優先順位は異なり、優先順位
&
が最も高く、優先順位|
が最も低くなります。
- これらの各演算子は構文的には左結合です(各グループは左から右へ)。
- オペランド式に副作用がない場合、各演算子は可換です。
- 各演算子は結合的です。
- ビット演算子と論理演算子を使用して、数値型の2つのオペランドまたは型の2つのオペランドを比較できます
boolean
。他のすべての場合は、コンパイル時エラーになります。
演算子がビット演算子として機能するか論理演算子として機能するかは、オペランドが「プリミティブ整数型に変換可能」であるか(§4.2)、または型であるboolean
かBoolean
(§5.1.8)によって異なります。
オペランドが整数型の場合、2つの数値の昇格(§5.6.2)が両方のオペランドに対して実行され、両方とも演算long
のsまたはint
s として残されます。演算のタイプは、(昇格された)オペランドのタイプになります。その時点で、&
ビットごとの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演算子の各オペランドは
boolean
or 型である必要があります。そうしないと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演算子の各オペランドは、タイプ
boolean
or Boolean
でなければなりません。そうでないと、コンパイル時エラーが発生します。
- 条件式または式のタイプは常に
boolean
です。
- 実行時には、左側のオペランド式が最初に評価されます。結果がtypeの場合、
Boolean
ボックス化解除の対象になります(§5.1.8)。
- 結果の値がの場合、
true
条件付きtrue
OR式の値はであり、右側のオペランド式は評価されません。
- 左側のオペランドの値がの場合、
false
右側の式が評価されます。結果がtypeの場合、Boolean
ボックス化解除の対象になります(§5.1.8ます)。結果の値は、条件式または式の値になります。
- したがって、on またはoperands
||
と同じ結果を計算します。これは、右側のオペランド式が常にではなく条件付きで評価されるという点でのみ異なります。|
boolean
Boolean
要するに、として@JohnMeagher繰り返しコメント欄で指摘している&
と|
され、実際には、あるいずれかのオペランドの特定の場合にブール演算子を非短絡boolean
またはBoolean
。良い慣行(つまり、二次的影響がない)では、これは小さな違いです。ただし、オペランドがboolean
sではない場合、Boolean
演算子の動作は大きく異なります。ビット単位の論理演算と論理演算は、Javaプログラミングの高レベルではうまく比較できません。