1

这是一个我无法解释清楚的问题。


哪个选项是错误的,为什么?

(A) a += (a++);   
(B) a += (++a);
(C) (a++) += a;
(D) (++a) += (a++);

A和 和有什么不一样B

我的理解: A是一个UB但B没关系,因为副作用++a将在分配之前完成。那正确吗?

更新:序列点之间++a和内部有什么区别?a++pre-increment(decrement) 的副作用可能在下一个 seq-point 之前的任何时间完成,就像 post-increment(decrement) 一样?

4

2 回答 2

6

Which option is wrong and why?

All of them are wrong, and that's because the first two invoke undefined behavior, and the last two don't compile. (And if they did, they would invoke UB as well.)

于 2013-08-22T14:12:01.657 回答
2

第一个和第二个是 UB,因为 C 没有定义应该首先评估的内容。

第三个和第四个不编译-原因: lvalue required as left operand of assignment

让我更具体地说明前两个:

a += (a++);- 等于a = a + (a++);

  • 如果a++首先评估,那么它是a = a + 1 + a;
  • 如果最后a++评估了,那么它是a = a + a;

但是C没有定义首先应该发生什么,所以它取决于实现,它是UB。

第二个也是一样。

于 2013-08-22T14:19:49.290 回答