为什么++++我常规但i ++++在C++中不常见?

Elm*_*dov 4 c++

当我使用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++为两个表达式重载,那么两者都将被很好地定义.

为此,请参阅此主题以了解说明和详细信息:

重新加载未定义的行为和序列点


Win*_*mer 6

C++标准在5.2.6节中说i ++的结果是一个可修改的左值,而在5.3.2中,++ i的结果是一个可修改的左值.这有助于解释为什么i ++++和++++ i不需要生成诊断并且有时可能看起来有效.

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

幸运的是,你的编译器诊断出i ++++.


Chr*_*utz 5

因为运营商的概念"签名"是:

?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所说,有效的行为会调用未定义的行为,就像在假设行为中不起作用的行为一样.