Подтвердить что ты не робот

Почему = + не вызывает ошибку компиляции?

По ошибке кто-то ошибочно использовал =+ вместо += в своем коде, и он не отображался как ошибка компиляции.

Это потому, что

int a =+ 2;

совпадает с

int a = 0 + 2;

?

4b9b3361

Ответ 1

Нет ошибки компиляции, поскольку + является допустимым (хотя и довольно бесполезным) унарным оператором таким же образом, что -:

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) затем применяется.

Короче говоря, это означает, что

  • числовые типы примитивных примитивов unboxed и
  • целые типы, меньшие, чем int, расширены до int.

Ответ 2

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