Подтвердить что ты не робот

Побитовый оператор и одиночный амперсанд

Возможный дубликат:
Почему мы обычно используем || not |, в чем разница?

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

4b9b3361

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