В дополнение к короткому замыканию следует помнить, что выполнение побитовой логической операции со значениями, которые могут быть отличны от 0 или 1, имеет совершенно другое значение, чем условная логика. Хотя он ОБЫЧНО одинаков для |
и ||
, с &
и &&
вы получите очень разные результаты (например, 2 & 4
равно 0 / false, а 2 && 4
равно 1 / true).
Если то, что вы получаете от функции, на самом деле является кодом ошибки, и вы проверяете не ноль, это может иметь большое значение.
Это не такая большая проблема в Java, где вам приходится явно вводить тип для логического значения или сравнивать с 0 и т. П., Но в других языках с похожим синтаксисом (C / C ++ и др.) Это может быть довольно запутанным.
Также обратите внимание, что & и | может применяться только к значениям целочисленного типа, а не ко всему, что может быть эквивалентно логическому тесту. Опять же, в не-Java языках есть довольно много вещей, которые можно использовать как логическое с неявным != 0
сравнением (указатели, числа с плавающей точкой, объекты с operator bool()
и т. Д.), А побитовые операторы почти всегда бессмысленны в этих контекстах.