Нет, они НЕ эквивалентны тому, как вы их выразили.
short x = 0, y = 0;
x -= y; // This compiles fine!
x = x - y; // This doesn't compile!!!
// "Type mismatch: cannot convert from int to short"
Проблема с третьей строкой заключается в том, что -
выполняет так называемое «числовое продвижение» ( JLS 5.6 ) коротких операндов
и приводит к значение int
, которое нельзя просто присвоить короткому
без приведения. Операторы составного присваивания содержат скрытое приведение!
Точная эквивалентность изложена в JLS 15.26.2 Операторы составного присваивания :
Выражение составного присваивания в форме E1 op = E2 эквивалентно E1 = (T) ((E1) op (E2)) , где T - это тип E1 , за исключением того, что E1 оценивается только однажды.
Чтобы прояснить некоторые тонкости:
int x = 5; х * = 2 + 1; // x == 15, а не 11
int i = 0; i + = 3,14159; // компилируется нормально!
arr [i ++] + = 5; // это увеличивает i только один раз
В Java также есть * =
, / =
, % =
, + =
, - =
, << =
, >> =
, >>> =
, & =
, ^ =
и | =
.Последние 3 также определены для логических значений ( JLS 15.22.2 Булевы логические операторы ).
Да, это так. Этот синтаксис одинаков для большинства языков, производных от C.
Не совсем так. Причина, по которой он был введен в C, заключалась в том, чтобы позволить программисту выполнить некоторые оптимизации, которые компилятор не мог. Например:
A[i] += 4
раньше компилировался намного лучше, чем
A[i] = A[i] + 4
компиляторами того времени.
И, если «x» имеет побочные эффекты, например, «x ++», то это сильно отличается.