Логические операторы
|| и
&& лево-ассоциативны, то есть их параметры вычисляются слева направо. Если первое значение оказалось
true в
|| или
false в
&& – конечный результат уже предрешен, он будет тем же. В этом случае происходит так называемое «короткое замыкание» (
short-circuiting) – оставшийся второй аргумент не вычисляется за ненадобностью.
Эту особенность иногда удобно эксплуатировать, например для проверки на null в одну строку:
return param != null && param.getBoolMember();
Но иногда такая ситуация влечет за собой неожиданные плавающие баги, если второй аргумент – не переменная, а функция с побочным эффектом. Для этой ситуации
введены версии операторов без короткого замыкания:
| и
&. Это
логические вариации «битового и» и «битового или».
Вдобавок доступен оператор «исключающее или»
^. Он почти никогда не используется для булевых параметров, потому что абсолютно эквивалентен более интуитивно понятному
!=. Другие битовые операторы для логических аргументов недоступны.