对C ++中的变量进行多次预增量操作(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没有序列点了,这个东西的措辞是“之前排序”/“之后排序”。 据说这是
如果对标量对象的副作用相对于同一标量对象的另一副作用或使用同一标量对象的值进行值计算而言是不确定的,则行为是未定义的。
++v
相当于v += 1
,相当于v = v + 1
(除了v只评估一次)。 这产生为++ (v = v + 1)
,我将写为inc = inc + 1
,其中inc
指代v = v + 1
的左值结果。
在C ++中0x ++ ++v
不是未定义的行为,因为对于a = b
,赋值在b和a的值计算之后排序,但在赋值表达式的值计算之前排序。 由此可见, v = v + 1
中的排序在inc
值计算之前被排序。 和在分配inc = inc + 1
是的值计算之后测序inc
。 最后,这两项任务将按顺序排列,并且没有未定义的行为。
上一篇: Multiple preincrement operations on a variable in C++(C ?)
下一篇: What belongs in an educational tool to demonstrate the unwarranted assumptions people make in C/C++?