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.
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]);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With