开发者

Why is this Undefined Behavior?

Why does the following gi开发者_开发技巧ven 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:

  • the two modifications of i are separated by a sequence point (the second comma).
  • the modification of i in i++ is separated from everything else by sequence points.
  • the modification of 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).
  • As Als says, in practice it wouldn't matter whether that code has defined behavior or not provided that everyone had the basic common sense not to write it ;-)


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜