2017-02-03 3 views
-1

Я хочу знать о внутренней функциональности для выполнения операций пост-инкремента или пост-декрементации на любом языке программирования, таком как java или C++.Какова внутренняя работа оператора post-increment?

Я имею в виду, как можно что-то (функция, метод ...) вернуть значение, а затем выполнить операции над ним?

ответ

1

Непонятно сказать, что операторы пост-инкремента/декремента работают с значением после его возврата. Семантика этих операторов, поскольку они определены в Java, C++ и, возможно, все другие языки, которые имеют такие операторы, состоят в том, что они изменяют значение и затем возвращают старое значение.

Мы могли бы определить Си ++, которая точно имитирует поведение ++ так:

int post_inc(int& x) { 
    int old_x = x; 
    x = x + 1; 
    return old_x; 
} 

С точки зрения генерируемой сборки, наиболее прямой способ для реализации postincrement (предполагается, что переменная находится в регистре) заключается в том, чтобы скопировать его во второй регистр, увеличить первый регистр и затем использовать второй регистр в зависимости от того, какое выражение было использовано в x++. При необходимости переменная считывается из памяти в первый регистр в начале и записанный из первого регистра обратно в память после приращения.

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

С точки зрения байт-кода Java реализация заключается в следующем: нажмите текущее значение переменной в стек, увеличьте переменную (не касаясь стека), затем оцените выражение, которое использовало x++.


Минус неопределенное поведение, потому что вызовы функций ввести точку последовательности

Смежные вопросы