为什么以下在 C++ 中编译?
int phew = 53;
++++++++++phew ;
相同的代码在 C 中失败,为什么?
为什么以下在 C++ 中编译?
int phew = 53;
++++++++++phew ;
相同的代码在 C 中失败,为什么?
注意:两个缺陷报告DR#637和DR#222对于理解以下行为原理很重要。
为了解释,在 C++0x 中有value computations
和side effects
。例如,副作用是赋值,而值计算正在确定左值所指的内容或从左值中读取值。请注意,C++0x 不再有序列点,并且这些内容的措辞是“sequenced before”/“sequenced after”。并且据说
如果标量对象的副作用相对于同一标量对象的另一个副作用或使用同一标量对象的值的值计算是未排序的,则行为未定义。
++v
等价于v += 1
which 等价于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
。最后,这两个分配将因此被排序,并且没有未定义的行为。
那是因为在C++
预增量运算符中返回anlvalue
并且它要求其操作数是 an lvalue
。
++++++++++phew ;
解释为++(++(++(++(++phew))))
但是,您的代码会调用Undefined Behaviour
,因为您试图在两个序列点phew
之间多次修改值。
在C
中,预增量运算符返回anrvalue
并要求其操作数为lvalue
。所以你的代码不能在 C 模式下编译。