当我使用i++++时,会出现编译错误:
for (int i=1;i<=10;i++++) {} //a.cpp:63: error: lvalue required as increment operand或
int i = 0;
i++++; // a.cpp:65: error: lvalue required as increment operand但是当我使用的时候,++++i是有效的。有人能解释一下为什么++++i是常规的而i++++不是常规的吗?
谢谢。
发布于 2011-05-13 13:12:44
因为x的类型是内置的原语类型,所以这两个表达式都会调用未定义行为,因为它们都试图在两个序列点之间修改同一对象两次。
这两个都不要做。
阅读以下常见问题解答:
Undefined behavior and sequence points
但是,如果x的类型是用户定义的类型,并且您已经为这两个表达式重载了operator++,那么这两个表达式都是定义良好的。
有关详细信息,请参阅本主题以了解相关说明和详细信息:
发布于 2011-05-13 13:22:55
C++标准在5.2.6节中指出,i++的结果是可修改的左值,而在5.3.2中,++i的结果是可修改的左值。这有助于解释为什么i++++和++++i不需要生成诊断信息,并且有时看起来像是在工作。
然而,++++i在前一个序列点和下一个序列点之间修改了i两次,因此结果仍然是未定义的行为。++++i是允许工作的,但它不是必须要工作的。
幸运的是,您的编译器诊断出了i++++。
发布于 2011-05-13 13:16:16
因为运算符的概念性“签名”是:
T& operator ++(T& a); // pre
T operator ++(T& a, int); // post
// note the int is solely to distinguish the two一个返回引用(左值),另一个不返回。但是,两者都以引用作为参数,因此返回引用的(++i)可以链接,而不返回引用的(i++)则不能。
请注意,正如@Nawaz所说,有效的调用未定义的行为,即使在假设中不起作用的也会调用未定义的行为。
https://stackoverflow.com/questions/5987482
复制相似问题