看起来这是一个非常奇怪的问题,因为我已经阅读了很多文档,其中增量和增量减量是一元操作,没有任何解释。
我可能错了,但++i
与i+=1
类似(如果没有任何重写):
int i = 1;
Console.WriteLine(++i); // 2
int j = 1;
Console.WriteLine(j+=1); // 2
在这种情况下,preincrement是简单的合成糖来隐藏二元运算符加上1
作为第二个参数。
不是吗?
为什么递增和递减是独立的一元操作, - 它不仅仅是二进制加运算符,带有值1
的预定义第二个参数吗?
答案 0 :(得分:1)
您的问题归结为为什么++
和--
首先存在,而正常+
和-
可以完成这项工作。
凭借今天的编译器优化功能,这完全是出于历史原因。 ++
和--
可以追溯到C. The Development of the C Language的早期(但不是最早的)天晚期 Dennis Ritchie ,作者C语言,提供了一些有趣的历史见解:
Thompson通过发明
++
和--
运算符更进了一步, 增加或减少;[...]
他们不在B的最早版本中,但是 一路走来。
[...]
更强烈的动力 对于创新可能是他对翻译的观察
++x
的{{1}}小于x=x+1
。
因此,明确的理由似乎在历史的迷雾中消失了,但Ritchie的这篇文章强烈建议增量和减量运算符的存在归功于早期编译器的性能问题。
当C ++被发明时,与C的兼容性是其发明者 Bjarne Stroustrup 的主要设计目标之一,因此不用说C ++中也存在所有C运算符。正如Stroustrup自己在FAQ中所说的那样:
我希望C ++能够与一个完整的语言兼容 即使是要求最苛刻的系统,也能提供高性能 编程。
对于C#,其发明者之一 Eric Lippert once stated here on the Stack Exchange network,在C#中支持它们的唯一原因是与旧语言的一致性:
[...] 这些运算符是可怕的功能。他们非常困惑;后 超过25年,我仍然将语义前后混淆。他们 鼓励将结果评估结合起来等坏习惯 产生副作用。有没有这些功能 C / C ++ / Java / JavaScript /等等,它们不是为C#发明的。
PS:C ++很特别,因为正如你所提到的(即使是错误的单词“overriding”),你可以重载所有这些操作符,这些操作符导致++
和--
在许多程序员的脑海中采用略微不同的语义。它们有时会读作“继续”(“返回”)或“向前迈出一步”(“向后退一步”),通常使用迭代器。如果你看一下C ++中的ForwardIterator概念,你会发现它只需要一元++
。
答案 1 :(得分:0)
答案很简单。
一元操作意味着操作员只对操作数进行操作。
接下来i ++和i + = 1都是不同的行为。
- >当i ++执行时,编译器将进入变量位置,它将增加值。
- > i + = 1执行i,1将加载到寄存器/ temparory变量中,加法运算完成,新值将复制到i地址loaction中。
因此,与i + = 1进行比较将与i ++进行成本比较。