Why does the following given expression invoke undefined behavior?
int i = 5;
i = (i,i++,i) + 1
My question is influenced by Als' question here
Why does the following given expression invoke undefined behavior?
int i = 5;
i = (i,i++,i) + 1
My question is influenced by Als' question here
It isn't undefined.
Answered here for C, Sequence points and partial order
I think the same applies in C++ (and here's my response before I saw that link):
The comma operator introduces a sequence point (and constrains to some extent the order in which the expression must be evaluated - left before right), so:
i
are separated by a sequence point (the second comma).i
in i++
is separated from everything else by sequence points.i
by =
is not separated from the last occurrence of i
in the expression, but that's OK because we're allowed to access i
and modify it without an intervening sequence point, provided that the access is "to determine the value to be stored" (5/4).Because it isn't defined in the standard which of the post-increment or the assignment will take place first; it is left to the compiler implementation to decide their order.
It is undefined in C++ to assign an incremented value to itself:
i = i++
What should i
be after this? Should it be the previous value or one plus the previous value? The order of execution is left to the compiler, so different platforms will have different results.