Я попытаюсь объяснить, почему ваш текущий код ведет себя так, как он ведет себя.
Первое, что нужно знать: |
- это побитовый оператор или. Второе, что нужно знать: |
имеет более высокий приоритет оператора, чем =
, и поэтому выполняется первым.
Итак, давайте посмотрим на первый код: $w=3|$r=2
. В соответствии с приоритетом оператора этот код можно записать так: $w=(3|$r=2)
. Таким образом, $r
get установлен правильно и затем выполняется $w=3|2
. 3
в двойной системе - 11
, а 2
- 10
.
11
| 10
====
11
Итак, результат верный.
Теперь давайте посмотрим на второй код:
$w=4|$r=2
совпадает с $w=(4|$r=2)
. $r
установлено правильно, затем выполняется $w=4|2
. 4
равно 100
в двойной системе, 2
равно 010
:
100
| 010
=====
110
И 110
в десятичной системе равно 6
!
Итак, теперь вы знаете, что получены неправильные значения, теперь давайте найдем решение:
Использование &&
здесь не рекомендуется, потому что, если первое значение было установлено на 0
, второе не будет установлено вообще. Кроме того, он имеет неправильный приоритет оператора: $w=1&&$r=2
совпадает с $w=(1&&$r=2)
. Так что $w
всегда будет присваиваться либо true
, либо false
.
Одним из возможных решений было бы использование оператора xor
. Этот оператор требует выполнения обеих сторон и имеет идеальный приоритет:
$i == 9 ? ($w = 1 xor $r = 2) : ($w = 2 xor $r = 3);
Но, как вы понимаете, это трудно читать, поэтому лучше не используйте его ...