我目前正在学习C#中的运算符和表达式,我知道如果我想将变量的值增加5,我可以通过两种不同的方式来实现:a = a + 5和a += 5。显然,第二种方式是更容易,更快的写作和更愉快的阅读。然而,就计算机而言,a += 5比a = a + 5快吗?与表达式的较长版本相比,编译和执行所需的时间更短吗?
发布于 2013-11-05 16:49:16
然而,就计算机而言,+= 5比a=a+5快吗?
两者是相同的,第一(a += 5)等于第二a = a + 5。
你可以看到:
+=算子(C#引用)
使用
+=赋值运算符(如x += y)的表达式等同于x = x + y,但x只计算一次。+操作符的含义取决于x和y的类型(数值操作数的加法,字符串操作数的级联,等等)。
因此,这取决于a的类型,在多个线程访问变量a的情况下,您可能得到不同的结果。但在大多数其他情况下,情况将是相同的:
密码:
static void Main(string[] args)
{
int a = 10;
a += 5;
Console.WriteLine(a);
}在发布模式中构建IL是
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 14 (0xe)
.maxstack 2
.locals init ([0] int32 a)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.5
IL_0005: add
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call void [mscorlib]System.Console::WriteLine(int32)
IL_000d: ret
} // end of method Program::Main通过代码生成相同的IL:
static void Main(string[] args)
{
int a = 10;
a = a + 5;
Console.WriteLine(a);
}IL (相同)是:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 14 (0xe)
.maxstack 2
.locals init ([0] int32 a)
IL_0000: ldc.i4.s 10
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: ldc.i4.5
IL_0005: add
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call void [mscorlib]System.Console::WriteLine(int32)
IL_000d: ret
} // end of method Program::Main发布于 2013-11-05 16:54:53
这取决于什么是a。a = a + 5对a进行两次评估。a += 5精确地计算a一次。
如果a是一个整数,那么这种差异在大多数情况下可能并不重要,尽管严格地说并非所有情况。例如,如果从多个线程访问a,则竞争条件的确切类型和窗口可能有所不同。
最重要的是,如果评估表达式会产生副作用,那么这是观察一次和两次观察的副作用之间的区别。在某些情况下,这可能是一件大事,可能会影响代码的正确性,而不仅仅是它的速度。
https://stackoverflow.com/questions/19794337
复制相似问题