Сегодня я писал код и забыл, что пишу на Java вместо Swift, и случайно набрал &+
. Удивительно, но я не получил никаких ошибок, а код скомпилировался и работал нормально.
Я немного поиграл и обнаружил, что &+
, &-
, |+
, |-
, ^+
и ^-
все компилируются и работают без ошибок. Похоже, что все они действуют как первый побитовый оператор при работе с числами:
1 &+ 2 == 1 & 2
3 |+ 4 == 3 | 4
7 ^+ 9 == 7 ^ 9
С другой стороны, похоже, что любая другая комбинация побитового оператора и математического оператора, например +&
, &/
и ^*
, приводит к ошибкам времени компиляции.
Почему &+
, &-
, |+
, |-
, ^+
и ^-
компилируются и работают без ошибок? Есть ли у них какая-то цель, которую я не вижу, или это просто какая-то странность компиляции?
+
означает Unary Plus Operator +
, что дает положительное число.
-
означает, что Unary Minus Operator -
дает отрицательное число.
1 &+ 2
это 1 & +2
3 |- 4
это 3 | -4
7 ^+ 9
это 7 ^ +9
Обратите внимание, что операторы *
и /
нельзя использовать одинаково (1 &/ 2
).
Чтобы правильно назвать его, знак +
— это Унарный плюс оператор, а -
— это Унарный минус оператор.
Просто также хочу отметить, ради интереса: не существует такой вещи, как отрицательный целочисленный литерал. Это унарный оператор минус и неотрицательный целочисленный литерал. Вы можете видеть это, потому что вы не можете написать -2147483648
, хотя это якобы равно Integer.MIN_VALUE
, потому что оно интерпретируется как -
, а затем 2147483648
, что слишком велико для литерала int.
Вы просто неправильно форматируете.
1 &+ 2
на самом деле1 & +2
. Вы можете поставить перед любым числом префикс+
или-
.