Побитовый оператор и одиночный амперсанд
Возможный дубликат:
Почему мы обычно используем ||
not |
, в чем разница?
Можно ли использовать один амперсанд, например &
вместо побитового оператора, например &&
? Какие разногласия могут возникнуть и есть ли конкретный пример, чтобы ясно проиллюстрировать эту проблему?
Ответы
Ответ 1
Единственный &
будет проверять оба условия всегда. Двойной &&
остановится после первого условия, если он будет равен false. Использование двух способов - это "короткое замыкание" проверки состояния, если вам действительно нужно только 1 условие 2, чтобы быть истинным или ложным.
Примером может быть:
if (myString != null && myString.equals("testing"))
Если myString
- null
, первое условие завершится неудачно, и он не потрудился бы проверить его значение. Это один из способов избежать нулевых указателей.
- с
&
и ¦
оба операнда всегда оцениваются
- с
&&
и ¦¦
второй операнд оценивается только тогда, когда это необходимо
Здесь ссылка на страницу с довольно хорошим объяснением того, как их использовать.
Краткое описание Java для операторов
Ответ 2
Другие ответы верны до степени, но не объясняют все это.
Во-первых, удвоенные операторы &&
и ||
, функционируют как вложенные операторы if
:
if (expression_a && expression_b) {
do_something;
}
эквивалентно
if (expression_a) {
if (expression_b) {
do_something;
}
}
В обоих случаях, если expression_a
оценивается как false
, тогда expression_b
не будет оцениваться - функция, называемая "короткое замыкание". (Случай ||
похож, но волосы сложнее.)
Кроме того, в Java (но не в C/С++) операторы &&
и ||
применяются только к логическим значениям - вы не можете использовать &&
или ||
на int
, например.
Единственные операторы &
и |
, с другой стороны, являются относительно "чистыми" операторами (коммутативными и ассоциативными по отношению к ним самим), причем ни одно из "коротких замыканий" двойных операторов. Кроме того, они могут работать на любом целочисленном типе - boolean, char, byte, short, int, long. Они выполняют побитовую операцию - бит N левого операнда имеет значение AND или ORed с битом N правого операнда для создания N-го бита в результате, которое является той же шириной бита, что и два операнда (после того, как они расширяются по мере необходимости для двоичных операторов). В этом отношении их работа с boolean
является просто вырожденным случаем (хотя и с некоторой особой обложкой).
Обычно для объединения булевых выражений в операторе if
можно использовать только удвоенные операторы. Нет никакого большого вреда в использовании одиночных операторов, если задействованные булевы выражения являются "безопасными" (например, не могут приводить к исключению нулевого указателя, например), но операторы с удвоением, как правило, несколько более эффективны и часто требуется короткое замыкание ( как, например, в if (a != null && a.b == 5)
), поэтому, как правило, разумно развивать привычку использовать удвоенные формы. Единственное, о чем следует опасаться, это то, что если вы хотите, чтобы второе выражение было оценено (для него побочные эффекты), оператор с удвоением не гарантирует, что это произойдет.