比a = a + 5快+ = 5?

Boy*_*lev 13 c# expression operators

我目前正在学习C#中的运算符和表达式,我明白如果我想将变量的值增加5,我可以用两种不同的方式来实现:a = a + 5a += 5.显然,第二种方式更容易,写得更快,阅读更愉快.但是,从计算机的角度来看,a += 5速度要快a = a + 5吗?编译和执行的时间是否比表达式的较长版本少?

Hab*_*bib 14

但是,在计算机方面,a = a = 5比a = a + 5快?

两者都相同,first(a += 5)等于second 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);
}
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

通过代码生成相同的IL:

static void Main(string[] args)
{
    int a = 10;
    a = a + 5;
    Console.WriteLine(a);
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • @Habib这取决于'a`是什么. (2认同)

Ser*_*rvy 6

这取决于什么a. a = a + 5评估a两次. 恰好a += 5评估一次.a

如果a是整数,那么在大多数情况下这种差异可能并不重要,尽管不是严格的所有情况.例如,如果a从多个线程访问,则竞争条件的确切类型和窗口可能不同.

最重要的是,如果评估表达产生副作用,那么观察到的一次副作用与观察两次的副作用之间的差异.在某些情况下,这可能是一个问题,可能会影响代码的正确性,而不仅仅是它的速度.