побитовый оператор и одиночный амперсанд [дубликат]

Возможные Дубликаты:
почему мы обычно используем || не | какая разница?

могу ли я использовать один амперсанд, как & вместо побитового оператора, такого как &&? Какие могут возникнуть различия и есть ли конкретный пример, чтобы четко проиллюстрировать этот вопрос?

2 ответов


один & всегда будет проверять оба условия. Дубль && остановится после первого условия, если оно будет равно false. Использование двух-это способ "короткого замыкания" проверки состояния, если вам действительно нужно только 1 Условие 2, чтобы быть истинным или ложным.

например:

if (myString != null && myString.equals("testing"))

если myString is null, первое условие не будет выполнено, и он не будет беспокоиться, чтобы проверить его значение. Это один из способов избежать null указатели.

  • С & и ¦ оба операнда всегда вычисляются
  • С && и ¦¦ второй операнд вычисляется только тогда, когда это необходимо

вот ссылка на страницу с довольно хорошим объяснением того, как использовать эти.

Java краткий справочник по операторам


другие ответы в какой-то степени верны, но не объясняют всего этого.

во-первых, удвоенные операторы,&& и ||, функция вроде как вложенные 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), например), поэтому обычно разумно культивировать привычку использовать двойные формы. Единственное, что нужно остерегаться, это то, что если вы хочу в второе выражение, которое нужно оценить (для его побочных эффектов), удвоенный оператор не гарантирует, что это произойдет.