为什么有前缀/后缀++但没有前缀/后缀+ =?

时间:2011-01-08 23:37:20

标签: java c++ c operators

这可能看起来像一个愚蠢的问题,但为什么在许多语言中存在++--运算符的前缀和后缀版本,但没有其他类似的前缀/后缀版本+=-=等运营商?例如,似乎我可以编写这段代码:

myArray[x++] = 137; // Write 137 to array index at x, then increment x

我应该能够写出像

这样的东西
myArray[5 =+ x] = 137; // Write 137 to array index at x, then add five to x

当然,这样的运营商不存在。是否有一个原因?这似乎是C / C ++ / Java中一种奇怪的不对称。

7 个答案:

答案 0 :(得分:6)

我猜有几个原因,我认为权重更高的可能是:

  • 可能没有被认为是太多真实用例(在早期可能没有发生过一些语言设计师)
  • 前/后增量直接映射到机器操作(至少在几台机器上),因此他们找到了进入语言的方式(更新:事实证明这并不完全正确,即使它在计算中通常也是如此)传说。见下文)。

然后,虽然前/后/递增/递减运算符的想法可能已经受到机器操作的影响,但看起来它们并没有专门用于语言以利用它。以下是丹尼斯·里奇对此的评价:

http://cm.bell-labs.com/cm/cs/who/dmr/chist.html

  汤普森通过发明增加或减少的++和 - 运算符更进了一步;它们的前缀或后缀位置确定更改是在注意操作数的值之前还是之后发生。它们不是最早版本的B,而是沿途出现。人们经常猜测它们是为了使用DEC PDP-11提供的自动递增和自动递减地址模式而创建的,C和Unix最初开始流行。这在历史上是不可能的,因为在开发B时没有PDP-11。然而,PDP-7确实有一些“自动增量”存储器单元,其特性是通过它们的间接存储器引用增加了单元。这个功能可能会向Thompson建议这样的操作员;使它们成为前缀和后缀的概括是他自己的。实际上,自动增量单元并没有直接用于运算符的实现,并且创新的更强烈动机可能是他观察到++ x的翻译小于x = x + 1的翻译。

答案 1 :(得分:4)

只要y没有副作用:

#define POSTADD(x,y) (((x)+=(y))-(y))

答案 2 :(得分:2)

我会做出一个假设。 ++i / i++有很多用例,在许多特定类型的增量(前/后)中有所不同。我不知道有多少次我看过像while (buf[i++]) {...}这样的代码。另一方面,+=的使用频率要低得多,因为一次将指针移动5个元素很少有意义。

所以,没有足够普通的应用程序,+=的后缀和前缀版本之间的区别很重要。

答案 3 :(得分:1)

我想这是因为它太神秘了。 有些人认为即使是++ / - 也应该避免,因为它们会导致混淆并导致大多数缓冲区溢出错误。

答案 4 :(得分:1)

因为 - 和++运算符映射到CPU中的inc(rement)和dec(rement)指令(除了添加和减去),并且这些运算符是假设映射到指令,因此它们作为单独的运算符存在。

答案 5 :(得分:1)

Java和C ++具有前后递增和递减运算符,因为C具有它们。 C有它们,因为C主要是针对PDP-11编写的,PDP-11有INCDEC指令。

在当天,优化编译器不存在所以如果你想使用单循环增量运算符,要么为它编写汇编程序,要么你的语言需要一个显式的运算符; C是一种可移植的汇编语言,具有显式的递增和递减运算符。此外,++ii++之间的性能差异现在很少发生,但它在1972年确实很重要。

请记住,C已接近40岁。

答案 6 :(得分:0)

如果我不得不猜测,通常会等同于:

x += 5;

...与:

x = x + 5;

出于显而易见的原因,写下来是荒谬的:

x + 5 = x;

我不确定如何仅使用5 =+ x运算符来模仿+的行为。顺便说一句,嗨htiek!