关于序列点和UB

时间:2013-08-22 14:09:35

标签: c undefined-behavior

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


哪个选项错了,为什么?

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

AB之间有什么区别?

我的理解: A是UB,B也可以,因为++a的副作用将在作业之前完成。是吗?

更新:序列点中++aa++之间的区别是什么?预增量(减量)的副作用可以在下一个seq点之前的任何时间完成,就像后增量(减量)一样?

2 个答案:

答案 0 :(得分:6)

  

哪个选项错了,为什么?

所有这些都是错的,那是因为前两个调用了未定义的行为,后两个不能编译。 (如果他们这样做,他们也会调用UB。)

答案 1 :(得分: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。

第二种情况也是如此。