In the general case, C++ allows comma separated statements to be evaluated in any order.
If you're referring to the commas between function arguments, that's just a separator.
In your case, you're using the comma operator, and that introduces a sequence point that guarantees that all side-effects from the comma's left operand have settled down before evaluating the right one.
So yes, it is well-defined.
From section 5.18/1 of the ISO C++98 standard:
A pair of expressions separated by a comma is evaluated left-to-right and the value of the left expression is discarded. The lvalue-to-rvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3) standard conversions are not applied to the left expression. All side effects (1.9) of the left expression, except for the destruction of temporaries (12.2), are performed before the evaluation of the right expression. The type and
value of the result are the type and value of the right operand; the result is an lvalue if its right operand is.
i++ <= 10
and get rid of the comma operator. Now go and tell me that this is beside your point.:)
– Fatal++i, i<= 10
is the same as++i <= 10
– Landscape++i <= 10
. Sorry for that. (I really shouldn't attempt to do that while chatting.) – Fatal