The order in which operands in an expression are evaluated is undefined in C except at the sequence points.
Evaluation of an expression may produce side effects. At certain specified points in the execution sequence called sequence points, all side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place.
The following are the sequence points defined by C99:
Between the previous and next sequence point an object can only have its stored value modified at most once by the evaluation of an expression. Additionally, the prior value
can be read only to determine the value to be stored.
In the following example, the order of evaluation of the operands to + is undefined.
a = i + b[++i]; |
If i was equal to 0 before the statement, this statement may be result in the following outcome:
a = 0 + b[1]; |
Or may also legally result in the following outcome:
a = 1 + b[1]; |
As a result, programs can not safely rely on the order of evaluatoin of operands between sequence pionts.
The following examples are independend on the order of evaluation of the operands and can only be interpreted in one way.
++i; a = i + b[i]; |
a = i + b[i+1]; ++i; |
There is no ordering of subexpressions implied by the assignment operator, so the behavior of the following statements is undefined:
i = ++i + 1; a[i++] = i; |
The following statements are allowed by the standard:
i = i + 1; a[i] = i; |