Так що для бінарних операторів в булевих, 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];