当我使用i++++给编译错误:
for (int i=1;i<=10;i++++) {} //a.cpp:63: error: lvalue required as increment operand
Run Code Online (Sandbox Code Playgroud)
要么
int i = 0;
i++++; // a.cpp:65: error: lvalue required as increment operand
Run Code Online (Sandbox Code Playgroud)
但是当我使用的时候++++i.有人解释我为什么++++i经常但i++++不规律?
谢谢.
Naw*_*waz 13
由于type x是内置基本类型,因此两个表达式都会调用未定义的行为,因为它们都试图在两个序列点之间两次修改同一个对象.
不要做其中任何一个.
阅读此常见问题:
但是,如果类型x是用户定义的类型,并且您已operator++为两个表达式重载,那么两者都将被很好地定义.
为此,请参阅此主题以了解说明和详细信息:
C++标准在5.2.6节中说i ++的结果是一个可修改的左值,而在5.3.2中,++ i的结果是一个可修改的左值.这有助于解释为什么i ++++和++++ i不需要生成诊断并且有时可能看起来有效.
但是,++++ i在前一个和下一个序列点之间修改了两次,因此结果仍然是未定义的行为.++++我被允许工作,但它没有必要.
幸运的是,你的编译器诊断出i ++++.
因为运营商的概念"签名"是:
?T& operator ++(T& a);? // pre
?T operator ++(T& a, int);? // post
// note the int is solely to distinguish the two
Run Code Online (Sandbox Code Playgroud)
一个返回引用(左值),另一个不返回.但是,两者都将引用作为参数,因此返回reference(++i)的那个可以被链接,而不能(i++)的那个不能.
请注意,正如@Nawaz所说,有效的行为会调用未定义的行为,就像在假设行为中不起作用的行为一样.
| 归档时间: |
|
| 查看次数: |
2490 次 |
| 最近记录: |