Ответ 1
Хотя ответ из @njzk2 верен, полезно указать, почему оно правильно.
Существуют и другие возможности - например, почему Java не выполняет оператор postincrement после назначения? (Ответ: потому что это не то, что выбрали разработчики языка Java)
Порядок оценки составных присвоений (например, +=
) указан в разделе 15.26.2 Спецификации языка Java. Я приведу как он определен для Java 8:
Сначала левый операнд оценивается для создания переменной. Если эта оценка завершается внезапно, то выражение присваивания внезапно завершается по той же причине; правый операнд не оценивается и никакого присваивания не происходит.
В противном случае значение левого операнда сохраняется, а затем оценивается правый операнд. Если эта оценка завершается резко, тогда выражение присваивания резко завершается для одна и та же причина и отсутствие назначения.
В противном случае сохраненное значение левой переменной и значение правого операнда используются для выполнения двоичной операции обозначенный оператором составного присваивания. Если эта операция завершается внезапно, тогда выражение присваивания резко завершается по той же причине, и никакого назначения не происходит.
В противном случае результат двоичной операции преобразуется в тип левой переменной, подвергается преобразованию набора значений (П. 5.1.13) до соответствующего стандартного значения (не значение расширенного значения экспоненты), и результат преобразования хранится в переменной.
Самое главное, что сначала сохраняется значение левого выражения, затем правая рука полностью оценивается, а затем результат составной операции сохраняется в переменной с левой стороны.