GavriKos, тут меня не возьмёшь :-) Я знаю, что && "экономит силы".
Если && видит, что первый операнд гарантирует результат - он "ленится" считать второй операнд.
Сергей, логические операторы вообще применяются ТОЛЬКО к булевым значениям. В том то и смысл. То что в каких то языках они могут применяться к числам\объектам - это отрабатывает приведение типов.
Соотетственно да, надо оба операнда привести к логическому выражению
Это не совсем логические операторы.
Это побитовые операторы, и операции они проводят над битами.
Например (в двоичной системе)
100 | 001 = 101
100 & 111 = 100
110 ^ 011 = 101
А про то, почему именно такой результат при работе с отрицательными числами - это тебе дз
Никогда не думал, что школьная программа по информатике пригодится при изучении программирования. :-)
11111011 -5
11111101 -3
---------------
11111001 -7
Если ты понимаешь, что происходит с +=, то почему возникает вопрос с этими, меняется ведь только операция?
Потому что в туториалах объясняют как работают самые примитивные операторы, а более сложные оставляют на "самоизучение". Да и тот же += интуитивно понятен.
представь числа в двоичном представлении, примени операцию для каждого бита
Вот так? (с единичками вместо минусов):
110 &111
1&1=1
1&1=1
1&1=0 ответ: 110, т.е., пять или минус два. Не выходит что-то с отрицательными числами... :-(
Или их надо инвертировать?
Если ты понимаешь, что происходит с +=, то почему возникает вопрос с этими, меняется ведь только операция?
a+=1 - это a=a+1
a|=1 это a=a|1
Но ведь как а может быть результатом сравнения a и b? Ведь тогда надо будет менять тип данных! Ведь в ответе может быть только true или false! Или чего-то не понимаю?
Сергей, отними 5 от нуля. Хз как такой код называется, но будет
11111011 (в int8)
В более длинном варианте просто левее будет больше единиц, до самого конца