Jat*_*tin 17 c c++ operators operator-precedence pre-increment
为什么以下用C++编译?
int phew = 53;
++++++++++phew ;
Run Code Online (Sandbox Code Playgroud)
相同的代码在C中失败,为什么?
Joh*_*itb 29
注意: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
计算值之前对asignment进行排序inc
.并且inc = inc + 1
在值计算之后对赋值进行排序inc
.最后,两个分配将按顺序排序,并且没有未定义的行为.
Pra*_*rav 14
这是因为在C++
预增量运算符中返回 a lvalue
并且它要求其操作数为a lvalue
.
++++++++++phew ;
在解释为 ++(++(++(++(++phew))))
但是,您的代码会调用,Undefined Behaviour
因为您尝试phew
在两个序列点之间修改多次值.
在C
,预增量运算符返回一个rvalue
并要求其操作数为lvalue
.所以你的代码不能在C模式下编译.