Итак, я знаю, что многие языки в стиле C имеют операторы декремента (--
) и инкремента (++
) и позволяют выполнять мутацию до или после вычисления всего выражения.
Что происходит, когда пост-инкремент происходит при возврате? Я не спрашиваю с точки зрения поведения, а скорее реализации.
Учитывая виртуальную машину (например, JavaScript/JVM) или физическую машину (например, скомпилированную C++), являются ли сгенерированные коды операций чем-то вроде следующего? (Предполагая аргументы/возвраты на основе стека.)
int x = 4, y = 8;
return f(++a) + y++;
Превращается в это: (Может быть?)
LOAD 4 A
LOAD 8 B
INC A
PUSH A
CALL F
POP INTO C
ADD C BY B
INC B
RET C
Если да, то как такие операции в этих языках решают, куда встроить приращение, когда выражение становится сложным, возможно, даже немного Lispish?
INC B
иADD C BY B
следует поменять местами, приращение кy
следует применять после суммы. Кроме того, еслиy
является локальной переменной, не будет ли приращение поста кy
мертвым кодом? - person Jorge Núñez   schedule 17.03.2013(x++ + y++) - z++
в С++, в спецификации нет ничего, что говорило бы, в каком порядке должны выполняться приращения поста, он будет оценивать сумму, вычитание, а затем он мог бы оценить пост увеличивается в любом порядке, который он хочет, или он может даже оценитьx++
после добавления точно так же. - person Jorge Núñez   schedule 17.03.2013