To make this suddenly long thread a bit more educational, since even when looking at C and pre-C++11 evaluation rules, many people don't see how that kind of output statement is broken, let's consider this simpified (but still broken) expression:
cout << *x << *x++
.
According to operator precedence and associativity rules, it parses as the following tree:
(ostream&) - cout
/
(ostream&) - <<
/ \
(ostream&)-<< (int) - * - (int*) - x
\
(int)- * -(int*)
\
post++ - (int*) - x
/
x - (int*)
|
(data in the tree flows right-to-left, the tokens in parentheses are the types)
Both <<'s here are member functions of std::ostream, so the rules for evaluation of function calls apply: there is a sequence point before the call to any function, at which point all side-effects of the function's arguments and, for member functions, the expression that yields the object on which it is called, are complete, and there is a sequence point at return from any function, at which point any side-effects that took place within the function are complete.
A "side-effect" in this context is the output to screen (what << is doing) or writing to a variable (what postincrement is doing).
The sequence point at the call to the right (in my tree) << says that before it starts execution, both read from x and evaluation of std::cout (produces a reference to ostream) are done. Neither operation has any side-effects anyway, so it doesn't matter here.
The sequence point at the call to the left << says that before it is called, side-effects from its arguments are complete, that is, the output from the right << is complete and the write to x from the postincrement is complete. It does not put any constraints on which happens first: the first output (which in turn requires the read from x) or the writing to x due to postincrement.
In practice this means that read from x required by the right << may come before or after write to x caused by the postincrement. The standard forbids this by the succinct "the prior value shall be accessed only to determine the value to be stored" (in this case the "prior value" is accessed to be output to screen instead), and the compilers assume that the programmer knows this, and reorder subexpressions, cache and precalculate results, never expecting such hidden data dependencies.
It's an unfortunate failure of many textbooks and courses that expression evaluation in C++ (and in C) is either not taught at all or is taught erroneously (using "right-to-left" or "left-to-right" concepts, which belong to other languages)