为什么在C++中可以将任意数量的预增量/减量运算符放在一起?

MAC*_*rha 0 c++ increment decrement

今天,我注意到可以做这样的事情(C++):

int x = 3;
++++x; // Correct!
----x; // Correct, too!
++++++x; // x is now 6
Run Code Online (Sandbox Code Playgroud)

这意味着我们可以将预增量和预减量放在一起.我对吗?我知道这不是一个好的做法,但是,如果我们使用它,或者例如,它的++++x表现是否优于x += 2

顺便说一下,不可能以这种方式使用后增量和后减量:

int x = 3;
x++++; // Error
x----; // Error
Run Code Online (Sandbox Code Playgroud)

为什么?

我的最后一个问题是,为什么它不适用于C#,Java,JavaScript,PHP甚至C?(注意:我不说Python和Ruby因为它们没有后缀/前缀增量/减量运算符)

提前致谢!

pet*_*hen 6

前缀和后缀增量都需要引用要递增的值.

++x 返回对(递增的)x的引用,这就是为什么可以链接前缀增量.

x++但是,Postfix会增加x并返回一个临时值的临时副本 - 而不是引用,因此无法链接.

表现与此无关.++++x并且x+=2是等价的 - 某些编译器可能会为一个或另一个生成更好的代码,但这并不是预期的,即使这样,在大多数执行平台上差异通常也可以忽略不计.

虽然++++x是合法的,但通常会被认为是不好的风格.


至于为什么其他语言不这样做:我不知道一个基本原理,虽然"不帮助程序员编写奇怪的代码"可能是合理的.它也可能只是其他规则的副作用.请注意,例如在C#中,表达式评估规则明显不同,例如,x = x++ + 1;在C和C++中是非定义行为,而在C#中则不是

  • 请注意,由于其他更改,`x = x ++ + 1;`现在恰好为C++ 17定义.甚至[标准文件中的一个例子](http://eel.is/c++draft/intro.execution#10). (2认同)