Il presunto problema da te riscontrato è un NON problema: nel senso che è GIUSTO che il comportamento sia indefinito.
Insomma il tuo è un classico errore da principianti, che purtroppo commettono anche molti presunti esperti.

vedi:
http://gcc.gnu.org/bugs.html#nonbugs_c
codice:
The following expressions have unpredictable results:

x[i]=++i
foo(i,++i)
i*(++i)                 /* special case with foo=="operator*" */
std::cout << i << ++i   /* foo(foo(std::cout,i),++i)          */
since the i without increment can be evaluated before or after ++i.
.