Take the following C code (K&R pg. 77) :
push(pop() - pop()); /* WRONG */
The book says that since -
and /
Order of evaluation is well-defined in C# in all cases, and is left-to-right. From C# language spec (§7.3):
The order of evaluation of operators in an expression is determined by the precedence and associativity of the operators (§7.2.1). Operands in an expression are evaluated from left to right. For example, in F(i) + G(i++) * H(i), method F is called using the old value of i, then method G is called with the old value of i, and, finally, method H is called with the new value of i. This is separate from and unrelated to operator precedence
In case of C++, it's not that the order couldn't be defined; it's that allowing the order to be undefined allows the compiler to better optimize code.