Так що для бінарних операторів в булевих, Java має &
, |
, ^
, &&
і ||
.
Давайте коротко підсумуємо, що вони тут коротко роблять:
- JLS 15.22.2 Логічні логічні оператори &, ^ та |
- JLS 15.23 Умовно-оператор &&
- JLS 15.24 Умовно-оператор ||
Адже
&
значення результату - це,true
якщо обидва значення операнда єtrue
; в іншому випадку результат єfalse
.Адже
|
значення результату - це,false
якщо обидва значення операнда єfalse
; в іншому випадку результат єtrue
.Бо
^
значення результату - цеtrue
якщо значення операнда різні; в іншому випадку результат єfalse
.
&&
Оператор подібний ,&
але оцінює її правий операнд тільки , якщо значення його лівого операнда єtrue
.
||
Оператор подібний|
, але оцінює її правий операнд тільки , якщо значення його лівого операнда єfalse
.
Зараз серед усіх 5, 3 з них мають складені версії присвоєння, а саме |=
, &=
і ^=
. Тож моє запитання очевидне: чому Java не надає, &&=
а ||=
також? Я вважаю , що мені потрібно більше , ніж ті , які мені потрібні &=
і |=
.
І я не думаю, що "тому що це занадто довго" - це хороша відповідь, тому що Java має >>>=
. Для цього упущення має бути краща причина.
З 15.26 Оператори присвоєння :
Існує 12 операторів присвоєння; [...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Був зауважений, що якби &&=
і ||=
були впроваджені, то це були єдині оператори, які не оцінюють праву сторону в першу чергу. Я вважаю, що це уявлення про те, що оператор складеного присвоєння спочатку оцінює праву частину, є помилковим.
З 15.26.2 Оператори складеного призначення :
Складений вираз присвоєння форми
E1 op= E2
еквівалентнийE1 = (T)((E1) op (E2))
, деT
- типE1
, за винятком того, щоE1
обчислюється лише один раз.
Як доказ, наступний фрагмент кидає a NullPointerException
, а не an ArrayIndexOutOfBoundsException
.
int[] a = null;
int[] b = {};
a[0] += b[-1];