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.