...
are not allowed because it modifies the same value twice.
Non-compliant Code Example 1
In the following example, the order of evaluation of the operands to + is undefined.
...
As a result, programs can not safely rely on the order of evaluatoin of operands between sequence pionts.
Compliant Solution 1
The following examples are independend on the order of evaluation of the operands and can only be interpreted in one way.
...
Code Block |
---|
a = i + b[i+1]; ++i; |
Non-compliant Code Example 2
There is no ordering of subexpressions implied by the assignment operator, so the behavior of the following statements is undefined:
Code Block |
---|
i = ++i + 1; a[i++] = i; |
Compliant Solution 2
The following statements are allowed by the standard:
Code Block |
---|
i = i + 1; a[i] = i; |
Non-compliant Code Example 3
The order of evaluation of arguments to a function is undefined.
Code Block |
---|
func(i++, i++); |
Compliant Solution
The following solution is appropiate when the programmer intends for both arguments to func() to be equivalent:
...
Code Block |
---|
j = i; j++; func(i, j); |
Consequences
References
- ISO/IEC 9899-1999 Section 5.1.2.3 Program execution
- ISO/IEC 9899-1999 Section 6.5 Expressions
- ISO/IEC 9899-1999 Annex C Sequence points
- comp.lang.c FAQ list - Questions 3.1, 3.2, 3.3, 3.3b, 3.7, 3.8, 3.9, 3.10a, 3.10b, 3.11