我目前正在学习 C# 中的运算符和表达式,并且我知道如果我想将变量的值增加 5,我可以通过两种不同的方式来实现:a = a + 5
和a += 5
. 显然,第二种方式写起来更容易、更快,读起来也更愉快。但是,在计算机方面,a += 5
比a = a + 5
? 与较长版本的表达式相比,编译和执行所需的时间是否更少?
问问题
663 次
2 回答
14
但是,在计算机方面,a += 5 是否比 a = a + 5 快?
两者相同, first( a += 5
) 等于 second a = a + 5
。
你可能会看到:
使用
+=
赋值运算符的表达式,例如,除了 x 只计算一次外,x += y
等价于。+ 运算符的含义取决于 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-05T16:49:16.877 回答
7
这取决于是什么a
。 a = a + 5
评估a
两次。 只a += 5
计算a
一次。
如果是一个整数,那么在大多数a
情况下,这种差异可能并不重要,尽管并非严格意义上的所有情况。例如,如果从多个线程访问,那么竞争条件的确切类型和窗口可能会有所不同。a
最重要的是,如果评估表达式会导致副作用,那就是观察一次与观察两次的副作用之间的差异。在某些情况下,这可能是一件大事,可能会影响代码的正确性,而不仅仅是它的速度。
于 2013-11-05T16:54:53.080 回答