Я просто хотел создать небольшую Java-Puzzle, но я озадачил себя. Одна часть головоломки:
Что делает следующий фрагмент кода:
public class test {
public static void main(String[] args) {
int i = 1;
i += ++i + i++ + ++i;
System.out.println("i = " + i);
}
}
Он выводит 9.
Мое (по крайней мере частично) неправильное объяснение:
Я не совсем уверен, но я думаю, что термин после i += оценивается следующим образом:

Итак,
int i = 1;
i += ++i + i++ + ++i;
совпадает с
int i = 1;
i += ((++i) + (i++)) + (++i);
Это оценивается слева направо (см. Предварительная и постинкрементная оценка java).
Первый ++i увеличивает i на 2 и возвращает 2. Итак, у вас есть:
i = 2;
i += (2 + (i++)) + (++i);
i++ возвращает 2, так как это новое значение i, и увеличивает i на 3:
i = 3;
i += (2 + 2) + ++i;
Второй ++i увеличивает i до 4 и возвращает 4:
i = 4;
i += (2 + 2) + 4;
Итак, вы получите 12, а не 9.
Где ошибка в моих объяснениях? Что было бы правильным объяснением?