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 EqualityExpressiontanımlanır §15.21 gerektirir, RelationalExpressiontanımlanan §15.20 da gerektirir, ShiftExpressionve ReferenceTypede tanımlandığı §15.19 ve §4.3 sırasıyla. ShiftExpressiongerektirir AdditiveExpressiontanımlanan §15.18 temel vb aritmetik, tekli operatörler, tanımlama, detaya devam ettiği, ReferenceTypebir tür temsil etmek tüm çeşitli şekillerde olan matkaplar aşağı. (İken ReferenceTypeilkel 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 booleanveya 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 longs veya ints 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 booleanya 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 trueher iki işlenen ise true, ^sonuçlanacaktır trueiki işlenen farklıysa, ve |neden olacaktır trueya 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, bve 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
booleanya da Booleanya 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,
falsekoşullu ve ifadenin değeri olur falseve 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 booleaniş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, bve 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
booleanveya olmalıdır Booleanveya 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,
truekoşullu veya ifadenin değeri olur trueve 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.|booleanBoolean
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 booleanda Boolean. İyi uygulamalarla (yani: ikincil etki yok), bu küçük bir farktır. Bununla birlikte, işlenenler booleans veya Booleans 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.