Что происходит (за кулисами), когда это выполняется?
intx=7; x = x++;
То есть, когда переменная увеличивается после и присваивается самой себе в одном операторе? Я скомпилировал и выполнил это. x все еще 7 даже после всего оператора. В моей книге говорится, что x увеличивается!
Переведено автоматически
Ответ 1
x = x++;
эквивалентно
inttmp= x; x++; x = tmp;
Ответ 2
x увеличивается. Но вы присваиваете старое значение x обратно самому себе.
x = x++;
x++ увеличивает значение x и возвращает его старое значение.
x = присваивает старое значение самому себе.
Итак, в конце концов, x возвращается к своему первоначальному значению.
Ответ 3
Инструкция:
x = x++;
эквивалентно:
tmp = x; // ... this is capturing the value of "x++" x = x + 1; // ... this is the effect of the increment operation in "x++" which // happens after the value is captured. x = tmp; // ... this is the effect of assignment operation which is // (unfortunately) clobbering the incremented value.
Короче говоря, оператор не имеет никакого эффекта.
Ключевые моменты:
Значение выражения постфиксного увеличения / уменьшения - это значение операнда, перед выполнением увеличения / уменьшения. (В случае префиксной формы значением является значение операнда после операции,)
RHS выражения присваивания полностью вычисляется (включая любые приращения, декременты и / или другие побочные эффекты) перед присвоением значения LHS.
Обратите внимание, что в отличие от C и Си ++, порядок вычисления выражения в Java полностью определен и нет места для вариаций в зависимости от платформы. Компиляторам разрешается изменять порядок операций только в том случае, если это не изменяет результат выполнения кода с точки зрения текущего потока. В этом случае компилятору будет разрешено оптимизировать всю инструкцию целиком, потому что можно доказать, что это ошибка.
На случай, если это еще не очевидно:
"x = x ++;" почти наверняка является ошибкой в любой программе.
OP (для исходного вопроса!), Вероятно, означал "x ++;", а не "x = x ++;".
Инструкции, которые сочетают автоматическое увеличение / декрементирование и присваивание одной и той же переменной, трудны для понимания, и поэтому их следует избегать независимо от их корректности. Просто нет необходимости писать подобный код.
Надеемся, средства проверки кода, такие как FindBugs и PMD, отметят подобный код как подозрительный.