Вопрос-ответ

What is x after "x = x++"?

Что такое x после "x = x ++"?

Что происходит (за кулисами), когда это выполняется?

int x = 7;
x = x++;

То есть, когда переменная увеличивается после и присваивается самой себе в одном операторе? Я скомпилировал и выполнил это. x все еще 7 даже после всего оператора. В моей книге говорится, что x увеличивается!

Переведено автоматически
Ответ 1
x = x++;

эквивалентно

int tmp = x;
x++;
x = tmp;
Ответ 2

x увеличивается. Но вы присваиваете старое значение x обратно самому себе.


x = x++;

  1. x++ увеличивает значение x и возвращает его старое значение.

  2. 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, отметят подобный код как подозрительный.

Ответ 4
int x = 7;
x = x++;

Это имеет неопределенное поведение в C а для Java смотрите Этот ответ . То, что происходит, зависит от компилятора.

2023-11-22 13:53 java