Результат a += a++

179
30 октября 2019, 17:40

Почему после выполнения такого кода

int a = 0;
a += a++;

В a записывается 0, а не 1?

Answer 1

Выражение

a += a++;

по определению оператора += эквивалентно выражению

a = a + a++;

В языке Java вычисление таких выражений и моменты возникновения побочных эффектов операторов однозначно упорядочены. Операнды бинарных операторов вычисляются слева-направо:

  1. Левая часть оператора присваивания тривиальна.
  2. Вычисляется правая часть оператора присваивания: выражение a + a++.
  3. Для этого сначала вычисляется левый операнд этого подвыражения: a. Значение a в этот момент равно 0. Значит значение левого операнда равно 0.
  4. Затем вычисляется правый операнд этого подвыражения: a++. Значение a в этот момент равно 0 и при вычислении a++ значение a увеличивается на 1. Однако результатом постфиксного инкремента по определению является исходное значение a, то есть 0.
  5. Теперь вычисляется бинарный +, то есть все подвыражение a + a++. Оно дает результат 0 (0 + 0). Обратите внимание, что в этот момент переменная a уже имеет значение 1, полученное на шаге 4.
  6. Затем выполняется присваивание: в переменную a заносится результат вычисления правой части, то есть 0. Это и есть финальное значение a.

Таким образом формально переменная a в течение какого-то мгновения "успела" получить значение 1 на шаге 4, но потом её значение было снова возвращено в 0 оператором присваивания на шаге 6

Обратите внимание, что если выражение a = a + a++ в конечном итоге заносит 0 в a, выражение a = a++ + a занесет в a значение 1.

Answer 2
  1. Читаем спецификацию: jls-15.14.2:

    The value of the postfix increment expression is the value of the variable before the new value is stored.

  2. Читаем про приоритеты.

Итог: сначала вычисляется a++ в самом a теперь 1, но результатом самой операции инкремента будет оригинальной значение a, т.е. 0; в итоге выражение сводится к a += 0; и в a будет 0.

READ ALSO
Как вызвать метод клаcа(java)

Как вызвать метод клаcа(java)

Только начал изучать джавуПоследняя строчка выдает ошибку

201
Как передать Context

Как передать Context

Пишу клавиатуру, пытаюсь вывести информацию из БД

179
CRUD операции в Spring Data JPA и Hibernate

CRUD операции в Spring Data JPA и Hibernate

Spring Data JPA – это не реализация JPA, это абстракция доступа к данным БД

196