C Code and Undefined Behavior – How to Determine Categories

arraysc++incrementlanguage-lawyerundefined-behavior

a is an array, foo is a function, and i is an int.

a[++i] = foo(a[i-1], a[i]);

Would the code above, have an Undefined Behavior?

The array indices ++i, i-1 and i, are guaranteed to be in the array range.

Best Answer

The behavior is undefined, but it's not because of the modification of the same object twice between two sequence points but it is UB because the side effect on i is unsequnced relative to the value computation of a[i-1] and a[i] using i.

ยง6.5-p(2):

If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side effect occurs in any of the orderings.84)

For example, expression

a[i++] = i;

invokes undefined behavior. Same is true for

a[++i] = foo(a[i-1], a[i]);
Related Question