首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在C++中使用++++i regular但使用i++++ not regular?

为什么在C++中使用++++i regular但使用i++++ not regular?
EN

Stack Overflow用户
提问于 2011-05-13 13:10:18
回答 5查看 3.1K关注 0票数 5

当我使用i++++时,会出现编译错误:

代码语言:javascript
复制
for (int i=1;i<=10;i++++) {} //a.cpp:63: error: lvalue required as increment operand

代码语言:javascript
复制
int i = 0;
i++++; // a.cpp:65: error: lvalue required as increment operand

但是当我使用的时候,++++i是有效的。有人能解释一下为什么++++i是常规的而i++++不是常规的吗?

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-13 13:12:44

因为x的类型是内置的原语类型,所以这两个表达式都会调用未定义行为,因为它们都试图在两个序列点之间修改同一对象两次。

这两个都不要做。

阅读以下常见问题解答:

Undefined behavior and sequence points

但是,如果x的类型是用户定义的类型,并且您已经为这两个表达式重载了operator++,那么这两个表达式都是定义良好的

有关详细信息,请参阅本主题以了解相关说明和详细信息:

Undefined behavior and sequence points reloaded

票数 13
EN

Stack Overflow用户

发布于 2011-05-13 13:22:55

C++标准在5.2.6节中指出,i++的结果是可修改的左值,而在5.3.2中,++i的结果是可修改的左值。这有助于解释为什么i++++和++++i不需要生成诊断信息,并且有时看起来像是在工作。

然而,++++i在前一个序列点和下一个序列点之间修改了i两次,因此结果仍然是未定义的行为。++++i是允许工作的,但它不是必须要工作的。

幸运的是,您的编译器诊断出了i++++。

票数 6
EN

Stack Overflow用户

发布于 2011-05-13 13:16:16

因为运算符的概念性“签名”是:

代码语言:javascript
复制
​T& operator ++(T& a);​     // pre
​T operator ++(T& a, int);​ // post
                          // note the int is solely to distinguish the two

一个返回引用(左值),另一个不返回。但是,两者都以引用作为参数,因此返回引用的(++i)可以链接,而不返回引用的(i++)则不能。

请注意,正如@Nawaz所说,有效的调用未定义的行为,即使在假设中不起作用的也会调用未定义的行为。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5987482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档