为什么++ i和i ++都会产生临时性

时间:2014-05-26 09:52:02

标签: c#

我记得在某处读到变量int i ++ i和i ++都在C#中生成临时变量。有谁知道为什么会这样?他们的表现相同吗?

更新

所以从Eric Lippert的副本中回答,预增量的步骤如下:

预增量

  

1)评估x以产生变量

     

2)将变量的值复制到临时位置

     

3)临时值递增以产生新值(不覆盖临时值!)

     

4)新值存储在变量

中      

5)操作的结果是新值

为什么第2步必要?为什么不在适当的位置增加变量?

1 个答案:

答案 0 :(得分:1)

答案是:他们没有。不是标题隐含的意义。

首先请注意:根据Eric的文章(令人惊讶的是,被许多人批评),在C#中以预增量和后增量发生的事件序列是相同的。不仅相似,而且相同。同样的事情也以同样的顺序发生。

其次,没有临时工作者'因此。临时位置' Eric指的是概念性的,但在实践中与机器寄存器相对应。将值从内存复制到寄存器,该值递增,并将值存储回内存。

但还有另一个方面。与C / C ++不同,C#保证了表达式的评估顺序。在C#中,以下代码是明确定义的,而在C中则不是。

j = ++i + i++;

但采取更简单的方法:

j = ++i + f(i); // first
j = i++ + f(i); // second

在第一种情况下,变量的值可用于后续表达式,但在第二种情况下则不是。相反,在下面的函数调用中使用的第一个增量产生一个概念临时值。在第二种情况下可以使用附加寄存器。