我记得在某处读到变量int i
++ i和i ++都在C#中生成临时变量。有谁知道为什么会这样?他们的表现相同吗?
更新
所以从Eric Lippert的副本中回答,预增量的步骤如下:
预增量
1)评估x以产生变量
2)将变量的值复制到临时位置
3)临时值递增以产生新值(不覆盖临时值!)
4)新值存储在变量
中5)操作的结果是新值
为什么第2步必要?为什么不在适当的位置增加变量?
答案 0 :(得分:1)
答案是:他们没有。不是标题隐含的意义。
首先请注意:根据Eric的文章(令人惊讶的是,被许多人批评),在C#中以预增量和后增量发生的事件序列是相同的。不仅相似,而且相同。同样的事情也以同样的顺序发生。
其次,没有临时工作者'因此。临时位置' Eric指的是概念性的,但在实践中与机器寄存器相对应。将值从内存复制到寄存器,该值递增,并将值存储回内存。
但还有另一个方面。与C / C ++不同,C#保证了表达式的评估顺序。在C#中,以下代码是明确定义的,而在C中则不是。
j = ++i + i++;
但采取更简单的方法:
j = ++i + f(i); // first
j = i++ + f(i); // second
在第一种情况下,变量的值可用于后续表达式,但在第二种情况下则不是。相反,在下面的函数调用中使用的第一个增量产生一个概念临时值。在第二种情况下可以使用附加寄存器。