Ответ 1

Я рад, что вы спросили, потому что несколько человек по другому вопросу пытались объяснить, почему так было (ответ plodoc, вероятно, был ближе всего). Наиболее важная часть:

§15.7.2 Оценить операнды до операции:

"Язык программирования Java также гарантирует, что каждый операнд оператора (кроме условного операторы &, || и &?:) появляется быть полностью оценена до любой части выполняется сама операция."

= здесь - Оператор простого присваивания = (§15.26.1)

Он также гарантирует, что первый операнд будет сначала оценен (§15.7.1), но в этом случае левая часть тривиальна.

Это означает, что x++ должен быть оценен до того, как будет обработан оператор присваивания. Инкремент будет выполняться перед назначением, и после его пошагового вычисления он оценивает x старое значение.

Наконец, "старый x" будет храниться в x, когда вычисляется оператор присваивания.

Важно подчеркнуть, что это не гарантируется на всех языках, независимо от того, что он делает в вашем компиляторе, или как интуитивно понятно (или нет).

Это также не вопрос приоритетности. ++ имеет более высокий приоритет, чем = в C и С++. Но в этих языках изменение переменной дважды между точками последовательности - это поведение undefined. Таким образом, полностью совместимые компиляторы C дают разные результаты.