Задать вопрос
@DmitryProsh

В чем разница между & и &&?

Разницу в названиях то я знаю. Но вот какая разница в фактическом выполнении?
Оба работают только с bool, верно?

Чем & отличается от логического && ?
Чем | отличается от логического || ?
Именно, как это влияет на результат возвращаемого значения?
  • Вопрос задан
  • 26969 просмотров
Подписаться 3 Средний Комментировать
Решения вопроса 1
ThePyzhov
@ThePyzhov
iOS Ninja
Побитовые операции работают с переменными целочисленного типа.
Если логические переменные сравнивают целиком две переменные, то побитовые сравнивают биты.
Например: a = 11 (в двоичной системе счисления это 1011), а b = 15 (это 1111). Тогда a & b вернет 11 (1011) (т.к. 1 и 1 = 1, 1 и 0 = 0, 1 и 1 = 1, 1 и 1 = 1). Но если a | b, тогда вернет 15 (1111) (1 или 1 = 1, 1 или 0 = 1, 1 или 1 = 1, 1 или 1 = 1).
Вот тут все очень неплохо показано на картинках.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@vilgeforce
Раздолбай и программист
& - битовая операция и работает с целыми, а не с bool как вы решили.
&& - операция логическая и работает с bool.
Аналогично с | и ||. Дальше - гугл по словам "%LANGNAME% operators"
Ответ написан
Комментировать
Rou1997
@Rou1997
Первый всегда проверяет оба условия на истинность, второй может и только первое проверить, для && достаточно ложности первого чтобы не проверять второе, для || - истинности первого, поэтому вторые слегка оптимальнее для быстродействия условий (if).
Ответ написан
@abcd0x00
Операции && || ! :
используются для проверки истинности своих операндов.

Операции & | ^ ~ << >> :
используются для управления битами в своих операндах.

Если у тебя есть переменные flag1, flag2, flag3, ты можешь проверить их на истинность:
if ((flag1 && flag2) || !flag3) {
    something;
}

А если у тебя есть переменная states, ты можешь проверить в ней какие-то определённые биты:
if (states & (0x1 | 0x4)) {
    something;
}

0x1 - в битовом представлении выглядит как
00000000 00000000 00000000 00000001

0x4 - в битовом представлении выглядит как
00000000 00000000 00000000 00000100

0x1 | 0x4 - в битовом представлении выглядит как
00000000 00000000 00000000 00000101

Пример1:
Если states равно 0x123 - в битовом представлении это выглядит как
00000000 00000000 00000001 00100011

Выражение states & (0x1 | 0x4) - в битовом представлении будет выглядеть как
00000000 00000000 00000001 00100011 &
00000000 00000000 00000000 00000101
=
00000000 00000000 00000000 00000001

Получилось, что всё выражение равно 0x1 или просто 1.
if (0x1) {
    something;
}


Пример2:
Если states равно 0x122 - в битовом представлении это выглядит как
00000000 00000000 00000001 00100010

Выражение states & (0x1 | 0x4) - в битовом представлении будет выглядеть как
00000000 00000000 00000001 00100010 &
00000000 00000000 00000000 00000101
=
00000000 00000000 00000000 00000000

Получилось, что всё выражение равно 0x0 или просто 0.
if (0x0) {
    something;
}
Ответ написан
Комментировать
@LioneNET
Все достаточно просто. В основном это легко можно понять если использовать вызов методов в javascript.
Например:
function a(variant){
    console.log("run a");
    return variant;
}

function b(variant){
    console.log("run b");
    return variant;
}

a(false) & b(false); //произведет вызов обеих функций, даже если первый метод вернет false
a(true) | b(true); //Аналогично первому вызовет оба метода даже если первый вернет true

a(true) || b(true); //второй метод не будет вызван, т.к первый уже вернул true
a(false) && b(true);//второй метод не будет вызван, т.к первый вернул false
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы