Diğer cevaplar, operatörler arasındaki fonksiyonel farkı örtmek için iyi bir iş çıkardı, ancak cevaplar bugün var olan hemen hemen her C türevi dile uygulanabilir. Soru ile etiketlendijavaJava dili için özel ve teknik olarak cevap vermeye çalışacağım.
&
ve |
Tamsayı Bitsel İşleçleri veya Boolean Mantıksal İşleçleri olabilir. Bitsel ve Mantıksal İşleçlerin sözdizimi ( §15.22 ):
AndExpression:
EqualityExpression
AndExpression & EqualityExpression
ExclusiveOrExpression:
AndExpression
ExclusiveOrExpression ^ AndExpression
InclusiveOrExpression:
ExclusiveOrExpression
InclusiveOrExpression | ExclusiveOrExpression
Sözdizimi EqualityExpression
tanımlanır §15.21 gerektirir, RelationalExpression
tanımlanan §15.20 da gerektirir, ShiftExpression
ve ReferenceType
de tanımlandığı §15.19 ve §4.3 sırasıyla. ShiftExpression
gerektirir AdditiveExpression
tanımlanan §15.18 temel vb aritmetik, tekli operatörler, tanımlama, detaya devam ettiği, ReferenceType
bir tür temsil etmek tüm çeşitli şekillerde olan matkaplar aşağı. (İken ReferenceType
ilkel türde içermez bunlar bir dizi için, boyut tipi olabilecek, ilkel türde tanımı sonuçta gereklidir olan bir ReferenceType
.)
Bitsel ve Mantıksal İşleçler aşağıdaki özelliklere sahiptir:
- Bu operatörler
&
, en yüksek önceliğe ve |
en düşük önceliğe sahip farklı önceliğe sahiptir .
- Bu operatörlerin her biri sözdizimsel olarak sol ilişkilidir (her grup soldan sağa).
- İşlenen ifadelerin hiçbir yan etkisi yoksa her operatör değişebilir.
- Her operatör ilişkiseldir.
- Bitsel ve mantıksal işleçler, iki türden iki işlenen veya iki türden işlenen karşılaştırmak için kullanılabilir
boolean
. Diğer tüm durumlar derleme zamanı hatasına neden olur.
Operatörün bitsel operatör veya mantıksal operatör olarak hizmet vermesi arasındaki fark, işlenenlerin "ilkel integral tipine dönüştürülebilir" ( §4.2 ) veya tip boolean
veya Boolean
( §5.1.8 ) tiplerine bağlı olmasına bağlıdır .
İşlenenler tümleşik türdeyse , her iki işlenende ikili sayısal tanıtım ( §5.6.2 ) yapılır ve bu işlem için long
s veya int
s olarak kalır . İşlemin türü (terfi) işlenenlerin türü olacaktır. Bu noktada, &
bitsel VE ^
olacak, bitsel özel VEYA ve |
bitsel kapsayıcı VEYA olacaktır. ( §15.22.1 )
İşlenen ise boolean
ya da Boolean
, işlenen gerekirse (eğer kutudan çıkarma dönüşüm tabi olacaktır §5.1.8 ) ve çalışma tipi olacaktır boolean
. &
sonuçlanacaktır true
her iki işlenen ise true
, ^
sonuçlanacaktır true
iki işlenen farklıysa, ve |
neden olacaktır true
ya işlenen ise true
. ( §15.22.2 )
Buna karşılık, &&
"Koşullu ve İşletmen" ( §15.23 ) ve ||
"Koşullu veya İşletmen" dir ( §15.24 ). Sözdizimleri şöyle tanımlanır:
ConditionalAndExpression:
InclusiveOrExpression
ConditionalAndExpression && InclusiveOrExpression
ConditionalOrExpression:
ConditionalAndExpression
ConditionalOrExpression || ConditionalAndExpression
&&
gibi &
sol işlenen ise sadece sağ işlenen değerlendirir dışında true
. ||
gibi |
sol işlenen ise sadece sağ işlenen değerlendirir dışında false
.
Koşullu-Ve aşağıdaki özelliklere sahiptir:
- Koşullu ve operatör sözdizimsel olarak sol ilişkilidir (soldan sağa gruplar).
- Koşullu ve operatör, hem yan etkiler hem de sonuç değeri açısından tamamen ilişkilidir. Kendisine, herhangi bir ifade için
a
, b
ve c
, ifade değerlendirilmesi ((a) && (b)) && (c)
, aynı yan etkileri ifade değerlendirilmesi olarak, aynı sırada meydana gelen, aynı sonucu üretir (a) && ((b) && (c))
.
- Koşullu ve operatör her işlenen tipte olmalıdır
boolean
ya da Boolean
ya da bir hata meydana gelen bir derleme.
- Koşullu ve ifadenin türü her zamandır
boolean
.
- Çalışma zamanında, önce sol taraftaki işlenen ifade değerlendirilir; sonucun türü varsa, kutudan çıkarma
Boolean
dönüşümüne tabi tutulur ( §5.1.8 ).
- Sonuçta elde edilen değer,
false
koşullu ve ifadenin değeri olur false
ve sağ taraftaki işlenen ifadesi değerlendirilmez.
- Sol taraftaki işlenenin değeri ise
true
, sağ taraftaki ifade değerlendirilir; sonucun türü varsa, kutudan çıkarmaBoolean
dönüşümüne tabi tutulur ( §5.1.8 ). Ortaya çıkan değer, koşullu ve ifadenin değeri olur.
- Böylece,
&&
aynı sonucu hesaplar &
üzerinde boolean
işlenen. Yalnızca sağ taraftaki işlenen ifadesinin her zaman değil koşullu olarak değerlendirilmesi bakımından farklılık gösterir.
Koşullu-Veya aşağıdaki özelliklere sahiptir:
- Koşullu veya operatör sözdizimsel olarak sol ilişkilidir (soldan sağa gruplar).
- Koşullu veya operatör, hem yan etkiler hem de sonuç değeri açısından tamamen ilişkilidir. Kendisine, herhangi bir ifade için
a
, b
ve c
, ifade değerlendirilmesi ((a) || (b)) || (c)
, aynı yan etkileri ifade değerlendirilmesi olarak, aynı sırada meydana gelen, aynı sonucu üretir (a) || ((b) || (c))
.
- Koşullu veya operatörün her işleneni tür
boolean
veya olmalıdır Boolean
veya derleme zamanı hatası oluşur.
- Koşullu veya ifadenin türü her zaman geçerlidir
boolean
.
- Çalışma zamanında, önce sol taraftaki işlenen ifade değerlendirilir; sonucun türü varsa, kutudan çıkarma
Boolean
dönüşümüne tabi tutulur ( §5.1.8 ).
- Sonuçta elde edilen değer,
true
koşullu veya ifadenin değeri olur true
ve sağ taraftaki işlenen ifadesi değerlendirilmez.
- Sol taraftaki işlenenin değeri ise
false
, sağ taraftaki ifade değerlendirilir; sonucun türü varsa, kutudan çıkarmaBoolean
dönüşümüne tabi tutulur ( §5.1.8 ). Ortaya çıkan değer, koşullu veya ifadenin değeri olur.
- Böylece, açık veya işlenenlerle
||
aynı sonucu hesaplar . Yalnızca sağ taraftaki işlenen ifadesinin her zaman değil koşullu olarak değerlendirilmesi bakımından farklılık gösterir.|
boolean
Boolean
Kısacası, @JohnMeagher yorumlarda defalarca işaret ettiği gibi &
ve |
aslında, işlenenlerin belirli bir durumunda kısa devre yapmayan boolean operatörler ya boolean
da Boolean
. İyi uygulamalarla (yani: ikincil etki yok), bu küçük bir farktır. Bununla birlikte, işlenenler boolean
s veya Boolean
s olmadığında , işleçler çok farklı davranırlar : bitsel ve mantıksal işlemler, yüksek düzeyde Java programlama ile iyi karşılaştırmaz.