对C ++中的variables进行多次预增量操作(C?)
为什么在C ++中编译?
int phew = 53; ++++++++++phew ;
在C中相同的代码失败,为什么?
这是因为在C++
pre-increment操作符返回一个lvalue
并且它的操作数是一个lvalue
。
++++++++++phew ;
在解释为++(++(++(++(++phew))))
但是,您的代码会调用Undefined Behaviour
因为您试图在两个序列点之间多次修改phew
的值。
在C
,预增值运算符返回一个rvalue
并要求其操作数为lvalue
。 所以你的代码不能在C模式下编译。
注意:两个缺陷报告DR#637和DR#222对于理解下面的行为原理很重要。
为了解释,在C ++ 0x中有value computations
和side effects
。 例如副作用就是分配,一个值计算就是确定一个左值是指什么,或者是从左值中读出值。 请注意,C ++ 0x没有序列点了,这个东西的措辞是“之前sorting”/“之后sorting”。 而且这是说
如果对标量对象的副作用相对于同一个标量对象的另一个副作用或者使用相同标量对象的值进行值计算而言是不确定的,则行为是不确定的。
++v
相当于v += 1
,相当于v = v + 1
(除了v只被评估一次)。 这产生为++ (v = v + 1)
,我将写为inc = inc + 1
,其中inc
指的是v = v + 1
的左值结果。
在C ++中0x ++ ++v
不是未定义的行为,因为对于a = b
,赋值在b和a的值计算之后sorting,而在赋值expression式的值计算之前。 因此,在v = v + 1
的sorting在inc
值计算之前sorting。 inc = inc + 1
的赋值在inc = inc + 1
值计算之后被sorting。 最后,这两项任务将按顺序排列,而且没有不确定的行为。