По ошибке кто-то ошибочно использовал =+
вместо +=
в своем коде, и он не отображался как ошибка компиляции.
Это потому, что
int a =+ 2;
совпадает с
int a = 0 + 2;
?
По ошибке кто-то ошибочно использовал =+
вместо +=
в своем коде, и он не отображался как ошибка компиляции.
Это потому, что
int a =+ 2;
совпадает с
int a = 0 + 2;
?
Нет ошибки компиляции, поскольку +
является допустимым (хотя и довольно бесполезным) унарным оператором таким же образом, что -
:
int x = +1;
int y = -1;
Соответствующий раздел в Спецификации Java Language Unary Plus Operator + (§15.15.3). Он указывает, что вызов унарной операции +
приводит к Unary Numeric Promotion (§5.6.1) операнда. Это означает, что:
Если операнд имеет тип времени компиляции
Byte
,Short
,Character
илиInteger
, он подвергается распаковке преобразования (§5.1.8). Затем результат повышается до значения типаint
путем расширения примитивная конверсия (§5.1.2) или преобразование идентичности (§5.1.1).В противном случае, если операнд имеет тип времени компиляции
Long
,Float
илиDouble
, он подвергается распаковке преобразования (§5.1.8).В противном случае, если операнд имеет тип времени компиляции
Byte
,Short
илиchar
, ему присваивается значение типаint
путем расширения примитивная конверсия (§5.1.2).В противном случае унарный числовой операнд остается как есть и не преобразован.
В любом случае преобразование значений (§5.1.13) затем применяется.
Короче говоря, это означает, что
int
, расширены до int
.Здесь может быть ошибка. Возможно, писатель намеревался написать a += 2;
В исходной версии C, a += 2;
и a =+ 2;
были синонимами. Если вы имели в виду a = +2;
, вы должны были быть осторожны, чтобы оставить пробел между =
и +
. То же самое со всеми другими операторами. a=*p;
умножить a на p. a = *p;
удалил указатель p и присвоил результат.
Затем они пришли в себя и начали давать предупреждения для =op
, где op=
был, вероятно, предназначен, и теперь больше не принимают =op
вообще.
Но старые привычки умирают тяжело. Программист старой школы C мог бы все же рассеянно использовать синтаксис старой школы, даже при написании на языке, отличном от C.
С другой стороны, =
in int x =+ 2;
является инициализацией, а не назначением, и программисту было бы странно думать в терминах увеличения переменной, которая только сейчас получает свое начальное значение.