c# - 为什么++i 和 i++ 都会生成临时文件

标签 c#

我记得在某处读到过,对于变量 int i,++i 和 i++ 在 C# 中生成了一个临时变量。有谁知道为什么会这样?它们的性能是否相同?

更新

所以从重复的Eric Lippert的回答来看,预增量的步骤如下:

对于预增

1) x is evaluated to produce the variable

2) the value of the variable is copied to a temporary location

3) the temporary value is incremented to produce a new value (not overwriting the temporary!)

4) the new value is stored in the variable

5) the result of the operation is the new value

为什么需要第 2 步?为什么不就地增加变量?

最佳答案

答案是:他们没有。不是标题所暗示的意思。

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

其次,不存在这样的“临时对象”。 Eric 所指的“临时位置”是概念性的,但实际上对应于机器寄存器。一个值从内存复制到寄存器,该值递增,然后该值存储回内存。

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

j = ++i + i++;

但采取更简单的方法:

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

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

关于c# - 为什么++i 和 i++ 都会生成临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23867423/

相关文章:

c# - UWP 的 WebRTC,新的 RTCPeerConnection() 没有完成执行

c# - 将对象实例传递给 Roslyn ScriptEngine

c# - 在调用 CompleteAdding 后添加到 BlockingCollection

c# - 如何从textBox删除提示音?

C#:intellisense 的属性仅在程序集之外显示方法

c# - 在基类中实现 IEquatable

c# - 如何为 Unity3D 编写线程安全的 C# 代码?

c# - Directory.GetFiles() 不适用于 "."模式

c# - 更改列表中的项目位置

c# - 将用 python 编写的应用程序转换为 c# 有什么充分的理由吗?