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 described:

Non-compliant Code Example

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.

Compliant Solution

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;

References

C99 5.1.2.3 Program execution
C99 Annex C Sequence points