Ожидается ли поведение кода из этого вопроса?
Является ли поведение от (другого вопроса) ошибкой или ожидаемым из спецификации JVM?
Ответ 1
Я рад, что вы спросили, потому что несколько человек по другому вопросу пытались объяснить, почему так было (ответ plodoc, вероятно, был ближе всего). Наиболее важная часть:
§15.7.2 Оценить операнды до операции:
"Язык программирования Java также гарантирует, что каждый операнд оператора (кроме условного операторы &, || и &?:) появляется быть полностью оценена до любой части выполняется сама операция."
=
здесь - Оператор простого присваивания = (§15.26.1)
Он также гарантирует, что первый операнд будет сначала оценен (§15.7.1), но в этом случае левая часть тривиальна.
Это означает, что x++
должен быть оценен до того, как будет обработан оператор присваивания. Инкремент будет выполняться перед назначением, и после его пошагового вычисления он оценивает x
старое значение.
Наконец, "старый x" будет храниться в x, когда вычисляется оператор присваивания.
Важно подчеркнуть, что это не гарантируется на всех языках, независимо от того, что он делает в вашем компиляторе, или как интуитивно понятно (или нет).
Это также не вопрос приоритетности. ++
имеет более высокий приоритет, чем =
в C и С++. Но в этих языках изменение переменной дважды между точками последовательности - это поведение undefined. Таким образом, полностью совместимые компиляторы C дают разные результаты.