问题
If I write code using comma operator like this:
int i;
i = 5, i++, i++;
does it invoke undefined behavior?
回答1:
No. It will not invoke undefined behavior as there is a sequence point between evaluation of left and right operands of comma operators.
=
has higher precedence than that of ,
operator and therefore 5
will bind to =
as
(i = 5), i++, i++;
Since operands of comma operator guaranteed to evaluates from left to right, i = 5
will be evaluated first and i
will be assigned 5
, then the second expression i++
will be evaluated and i
will be 6
and finally the third expression will increment i
to 7
.
The above statement is equivalent to
i = 5;
i++;
i++;
回答2:
does it invoke undefined behavior?
No, because of both the sequence points the comma operator introduces and operator precedence. A sequence point assures that all side effects of the previous evaluations have been performed before evaluating the following expressions.
Sequence points and operator precende assure that in the i = 5, i++, i++;
statement, i
will be initialized before evaluating any of the i++
expressions.
The statement:
i = 5, i++, i++;
is, considering operator precedence, equivalent to:
((i = 5), i++), i++;
So, first (i = 5)
is evaluated. After its side effects are over (i.e.: after i
is initialized to 5
), the following expression, i++
is evaluated. Again, after the side effect this last expression introduces is over (i.e.: i
is increased by one), the last expression, i++
, is evaluated.
回答3:
No, does not invoke undefined behavior because the comma operator is a sequence point. i
is assigned a value of 5
and then incremented twice.
来源:https://stackoverflow.com/questions/46212001/behavior-of-comma-operator-in-c