Yani boolelerde ikili operatörler için Java vardır &
, |
, ^
, &&
ve ||
.
Burada yaptıklarını kısaca özetleyelim:
- JLS 15.22.2 Boolean Mantıksal Operatörler &, ^, ve |
- JLS 15.23 Koşullu ve Operatör &&
- JLS 15.24 Koşullu Veya Operatör ||
İçin
&
, sonuç değeri,true
her iki işlenen değerintrue
; aksi takdirde sonuç olurfalse
.İçin
|
, sonuç değeri,false
her iki işlenen değerinfalse
; aksi takdirde sonuç olurtrue
.Çünkü
^
, sonuç değeri,true
işlenen değerlerinin farklı olmasıdır; aksi takdirde sonuç olurfalse
.
&&
Operatör gibidir&
ama onun sol elin değeridir işleneninin sağ işlenen yalnızca değerlendirirtrue
.
||
Operatör gibidir|
, ama onun sol elin değeridir işleneninin sağ işlenen yalnızca değerlendirirfalse
.
Şimdi, bütün 5 arasında olanların 3 yani bileşik atama sürümleri var |=
, &=
ve ^=
. Öyleyse sorum açık: Java neden &&=
ve ||=
aynı zamanda sağlamıyor ? Bunlara ihtiyacım olandan daha fazlasına ihtiyacım olduğunu görüyorum &=
ve |=
.
Ve "çok uzun olduğu için" nin iyi bir cevap olduğunu düşünmüyorum, çünkü Java var >>>=
. Bu ihmal için daha iyi bir neden olmalı.
Gönderen 15.26 Atama Operatörleri :
12 atama operatörü vardır; [...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Uygulanırsa &&=
ve ||=
uygulanırsa, ilk önce sağ tarafı değerlendirmeyen tek operatör olacağı yorumunda bulunuldu . Bir bileşik atama operatörünün önce sağ tarafı değerlendirdiği şeklindeki bu fikrin bir hata olduğuna inanıyorum.
15.26.2'den itibaren Bileşik Atama Operatörleri :
Formun bir bileşik atama ifadesi, yalnızca bir kez değerlendirilmesinin dışında , türünün olduğu yere
E1 op= E2
eşdeğerdir .E1 = (T)((E1) op (E2))
T
E1
E1
Kanıt olarak, aşağıdaki kod parçası bir NullPointerException
değil a atar ArrayIndexOutOfBoundsException
.
int[] a = null;
int[] b = {};
a[0] += b[-1];