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