Непонятно сказать, что операторы пост-инкремента/декремента работают с значением после его возврата. Семантика этих операторов, поскольку они определены в Java, C++ и, возможно, все другие языки, которые имеют такие операторы, состоят в том, что они изменяют значение и затем возвращают старое значение.
Мы могли бы определить Си ++, которая точно имитирует поведение ++
так:
int post_inc(int& x) {
int old_x = x;
x = x + 1;
return old_x;
}
С точки зрения генерируемой сборки, наиболее прямой способ для реализации postincrement (предполагается, что переменная находится в регистре) заключается в том, чтобы скопировать его во второй регистр, увеличить первый регистр и затем использовать второй регистр в зависимости от того, какое выражение было использовано в x++
. При необходимости переменная считывается из памяти в первый регистр в начале и записанный из первого регистра обратно в память после приращения.
Во многих случаях оптимизация компиляторов будет переупорядочивать код, чтобы просто использовать один отдельный регистр, который увеличивается после выражения (но это невозможно во всех случаях - например, оно не будет работать, если сама переменная используется в одном выражении (запрет неопределенного поведения на C или C++)).
С точки зрения байт-кода Java реализация заключается в следующем: нажмите текущее значение переменной в стек, увеличьте переменную (не касаясь стека), затем оцените выражение, которое использовало x++
.
Минус неопределенное поведение, потому что вызовы функций ввести точку последовательности