(on the postfix "++" operator)
... I don't see how the increment could possibly take place
/before/ the old value had ever been "sampled".
Some of this depends on what one means by "sampled", but consider
the following concrete expansion of:
i = j++;
on a machine with i and j in registers:
inc reg_holding_j # j = j + 1
sub reg_holding_j, 1, reg_holding_i # i = j - 1
Here, even though the "inc" happens "last" in principle (because i
has to get set to the old value of j), the compiler has for some
reason incremented j first, then subtracted 1 from the result to
re-compute the old value.
(Of course, the original example was more like "*p++", which probably
would have added 8 to p on a byte-oriented machine -- but the above
still works if one changes all the "1"s to "8"s. It is legal, just
peculiar, to do the increment first. There are some odd instruction
sets that encourage this kind of odd machine code, though.)