为什么在 C++ 中可以将任意数量的 pre-increment/decrement 运算符放在一起?

Why is putting an arbitrary number of pre-increment/decrement operators together possible in C++?

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

int x = 3;
++++x; // Correct!
----x; // Correct, too!
++++++x; // x is now 6

这意味着我们可以将尽可能多的预增量和预减量放在一起。我对吗?我知道这不是一个好的做法,但是,我们应该使用它吗?例如,++++x 是否比 x += 2 表现更好?

顺便说一句,不可能使用 post-increments 和 post-decrements:

int x = 3;
x++++; // Error
x----; // Error

为什么?

我的最后一个问题是,为什么它在 C#、Java、JavaScript、PHP 甚至 C 中不起作用? (注意:我没有说 Python 和 Ruby 因为它们有 none 个 postfix/prefix increment/decrement 运算符)

提前致谢!

为什么这不在 java、C# 中,没有可靠的答案。每种语言的设计者都有自己的选择,就像java中没有指针一样。此外,您提到的所有语言都不会创建任何二进制文件。他们都需要一个虚拟机。因此,从 C/C++ 创建的 exe 与为 jvm 创建的 class 文件完全不同。

关于 pre-increment 的表现。对于每个操作,C++ 编译器都会生成汇编指令。因此对于 ++xx = x + 1 编译器将生成相同的汇编指令,因此两种情况下的性能速度相同。

也没有前言回答为什么 C++ 编译器设计器允许 ++++x; 而不是 x++++;。此外,此 ++++x; 在 C++ 中并不常见。

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

++x returns 对(递增的)x 的引用,这就是可以链接前缀递增的原因。

后缀 x++ 然而,递增 x 和 returns 先前值的临时副本 - 不是引用,因此它不能被链接。

性能与此处无关。 ++++xx+=2 是等价的——一些编译器可能会为一个或另一个生成更好的代码,但这不是预期的,即便如此,在大多数执行平台上差异通常可以忽略不计。

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


至于为什么其他语言不这样做:我不知道其中的原理,尽管 "don't help programmers write weird code" 可能是合理的。它也可能只是其他规则的副作用。请注意,例如在 C# 中,表达式求值规则明显不同,例如x = x++ + 1; 在 C 和 C++ 中是未定义的行为,但在 C#

中不是