Java: + = эквивалентность

:

x -= y;

эквивалентный:

x = x - y;
8
задан dukevin 20 May 2012 в 22:09
поделиться

3 ответа

Нет, они НЕ эквивалентны тому, как вы их выразили.

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 оценивается только однажды.

Чтобы прояснить некоторые тонкости:

  • Выражение составного присваивания не меняет порядок операндов
    • Левая сторона остается слева, правая часть остается на right
  • Оба операнда полностью заключены в круглые скобки, чтобы гарантировать, что op имеет самый низкий приоритет
    • int x = 5; х * = 2 + 1; // x == 15, а не 11
  • Есть скрытое приведение
    • int i = 0; i + = 3,14159; // компилируется нормально!
  • Левая часть оценивается только один раз
    • arr [i ++] + = 5; // это увеличивает i только один раз

В Java также есть * = , / = , % = , + = , - = , << = , >> = , >>> = , & = , ^ = и | = .Последние 3 также определены для логических значений ( JLS 15.22.2 Булевы логические операторы ).

Связанные вопросы

38
ответ дан 5 December 2019 в 04:39
поделиться

Да, это так. Этот синтаксис одинаков для большинства языков, производных от C.

5
ответ дан 5 December 2019 в 04:39
поделиться

Не совсем так. Причина, по которой он был введен в C, заключалась в том, чтобы позволить программисту выполнить некоторые оптимизации, которые компилятор не мог. Например:

A[i] += 4

раньше компилировался намного лучше, чем

A[i] = A[i] + 4

компиляторами того времени.

И, если «x» имеет побочные эффекты, например, «x ++», то это сильно отличается.

2
ответ дан 5 December 2019 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: