As an addition to my reply, if you really want to scratch your head:
int a = 1; std::cout << ++a << ++a << ++a;
MSVC2012, both release and debug builds, prints "444".
There are six expressions; evaluate ++a three times, and the side effect of ++a three times. The side effect has to occur before the corresponding evaluation since it's a pre-increment, and the compiler simply stick all three increments first into a single a+=3 and then proceeds to evaluate the value of a as 4 three times.
Still undefined behavior, of course.