为什么在 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++ 编译器都会生成汇编指令。因此对于 ++x
和 x = x + 1
编译器将生成相同的汇编指令,因此两种情况下的性能速度相同。
也没有前言回答为什么 C++ 编译器设计器允许 ++++x;
而不是 x++++;
。此外,此 ++++x;
在 C++ 中并不常见。
前缀和后缀递增都需要引用要递增的值。
++x
returns 对(递增的)x 的引用,这就是可以链接前缀递增的原因。
后缀 x++
然而,递增 x 和 returns 先前值的临时副本 - 不是引用,因此它不能被链接。
性能与此处无关。 ++++x
和 x+=2
是等价的——一些编译器可能会为一个或另一个生成更好的代码,但这不是预期的,即便如此,在大多数执行平台上差异通常可以忽略不计。
虽然 ++++x
是合法的,但通常会被认为是不良风格。
至于为什么其他语言不这样做:我不知道其中的原理,尽管 "don't help programmers write weird code" 可能是合理的。它也可能只是其他规则的副作用。请注意,例如在 C# 中,表达式求值规则明显不同,例如x = x++ + 1;
在 C 和 C++ 中是未定义的行为,但在 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++ 编译器都会生成汇编指令。因此对于 ++x
和 x = x + 1
编译器将生成相同的汇编指令,因此两种情况下的性能速度相同。
也没有前言回答为什么 C++ 编译器设计器允许 ++++x;
而不是 x++++;
。此外,此 ++++x;
在 C++ 中并不常见。
前缀和后缀递增都需要引用要递增的值。
++x
returns 对(递增的)x 的引用,这就是可以链接前缀递增的原因。
后缀 x++
然而,递增 x 和 returns 先前值的临时副本 - 不是引用,因此它不能被链接。
性能与此处无关。 ++++x
和 x+=2
是等价的——一些编译器可能会为一个或另一个生成更好的代码,但这不是预期的,即便如此,在大多数执行平台上差异通常可以忽略不计。
虽然 ++++x
是合法的,但通常会被认为是不良风格。
至于为什么其他语言不这样做:我不知道其中的原理,尽管 "don't help programmers write weird code" 可能是合理的。它也可能只是其他规则的副作用。请注意,例如在 C# 中,表达式求值规则明显不同,例如x = x++ + 1;
在 C 和 C++ 中是未定义的行为,但在 C#