From the C++ (C++11) standard, §1.9.15 which discusses ordering of evaluation, is the following code example:
void g(int i, int* v) {
i = v[i++]; // the beha
In this example I would think that the subexpression i++ would be completely evaluated before the subexpression v[...] is evaluated, and that the result of evaluation of the subexpression is i (before the increment), but that the value of i is the incremented value after that subexpression has been completely evaluated.
The increment in i++
must be evaluated before indexing v
and thus before assigning to i
, but storing the value of that increment back to memory need not happen before. In the statement i = v[i++]
there are two suboperations that modify i
(i.e. will end up causing a store from a register into the variable i
). The expression i++
is equivalent to x=i+1
, i=x
, and there is no requirement that both operations need to take place sequentially:
x = i+1;
y = v[i];
i = y;
i = x;
With that expansion, the result of i
is unrelated to the value in v[i]
. On a different expansion, the i = x
assignment could take place before the i = y
assignment, and the result would be i = v[i]