По ошибке кто-то ошибочно использовал =+ вместо += в своем коде, и он не отображался как ошибка компиляции.
Это потому, что
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; является инициализацией, а не назначением, и программисту было бы странно думать в терминах увеличения переменной, которая только сейчас получает свое начальное значение.