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