这是一个我无法解释的问题。
哪个选项错了,为什么?
(A) a += (a++);
(B) a += (++a);
(C) (a++) += a;
(D) (++a) += (a++);
A
和B
之间有什么区别?
我的理解:
A
是UB,B
也可以,因为++a
的副作用将在作业之前完成。是吗?
更新:序列点中++a
和a++
之间的区别是什么?预增量(减量)的副作用可以在下一个seq点之前的任何时间完成,就像后增量(减量)一样?
答案 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。
第二种情况也是如此。