18

为什么以下在 C++ 中编译?

int phew = 53;
++++++++++phew ;

相同的代码在 C 中失败,为什么?

4

2 回答 2

31

注意:两个缺陷报告DR#637DR#222对于理解以下行为原理很重要。


为了解释,在 C++0x 中有value computationsside effects。例如,副作用是赋值,而值计算正在确定左值所指的内容或从左值中读取值。请注意,C++0x 不再有序列点,并且这些内容的措辞是“sequenced before”/“sequenced after”。并且据说

如果标量对象的副作用相对于同一标量对象的另一个副作用或使用同一标量对象的值的值计算是未排序的,则行为未定义。

++v等价于v += 1which 等价于v = v + 1(除了 v 只计算一次)。这会产生++ (v = v + 1)我将写为的结果inc = inc + 1,其中inc指的是 的左值结果v = v + 1

在 C++0x++ ++v中不是未定义的行为,因为a = b赋值是在 b 和 a 的值计算之后排序的,但在赋值表达式的值计算之前。因此, in 的赋值在v = v + 1的值计算之前排序inc。中的赋值inc = inc + 1是在 的值计算之后排序的inc。最后,这两个分配将因此被排序,并且没有未定义的行为。

于 2010-09-11T15:04:24.393 回答
15

那是因为在C++预增量运算符中返回anlvalue并且它要求其操作数是 an lvalue

++++++++++phew ;解释为++(++(++(++(++phew))))

但是,您的代码会调用Undefined Behaviour,因为您试图在两个序列点phew之间多次修改值。

C中,预增量运算符返回anrvalue并要求其操作数为lvalue。所以你的代码不能在 C 模式下编译。

于 2010-09-11T07:07:15.650 回答