Почему после выполнения такого кода
int a = 0;
a += a++;
В a записывается 0, а не 1?
Выражение
a += a++;
по определению оператора += эквивалентно выражению
a = a + a++;
В языке Java вычисление таких выражений и моменты возникновения побочных эффектов операторов однозначно упорядочены. Операнды бинарных операторов вычисляются слева-направо:
a + a++.a. Значение a в этот момент равно 0. Значит значение левого операнда равно 0.a++. Значение a в этот момент равно 0 и при вычислении a++ значение a увеличивается на 1. Однако результатом постфиксного инкремента по определению является исходное значение a, то есть 0.+, то есть все подвыражение a + a++. Оно дает результат 0 (0 + 0). Обратите внимание, что в этот момент переменная a уже имеет значение 1, полученное на шаге 4.a заносится результат вычисления правой части, то есть 0. Это и есть финальное значение a.Таким образом формально переменная a в течение какого-то мгновения "успела" получить значение 1 на шаге 4, но потом её значение было снова возвращено в 0 оператором присваивания на шаге 6
Обратите внимание, что если выражение a = a + a++ в конечном итоге заносит 0 в a, выражение a = a++ + a занесет в a значение 1.
Читаем спецификацию: jls-15.14.2:
The value of the postfix increment expression is the value of the variable before the new value is stored.
Читаем про приоритеты.
Итог: сначала вычисляется a++ в самом a теперь 1, но результатом самой операции инкремента будет оригинальной значение a, т.е. 0; в итоге выражение сводится к a += 0; и в a будет 0.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости