13

私は現在、C# の演算子と式について学んでおり、変数の値を 5 ずつ増やしたい場合は、2 つの異なる方法で実行できることを理解しました:a = a + 5a += 5. どうやら、2 番目の方法は、書くのが簡単で速く、読むのがより快適です。ただし、コンピューターに関してはa += 5a = a + 5? 式の長いバージョンよりもコンパイルと実行にかかる時間が短いですか?

4

2 に答える 2

14

しかし、コンピュータ的には、a += 5 は a = a + 5 よりも高速ですか?

どちらも同じです。 first( a += 5) は second と同じa = a + 5です。

以下が表示される場合があります。

+= 演算子 (C# リファレンス)

+=などの代入演算子を使用する式は、 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であるかによって異なります。 2回 a = a + 5評価します。正確に1 回評価します。aa += 5a

aが整数の場合、厳密にはすべての場合ではありませんが、ほとんどの場合、その違いは問題にならない可能性があります。たとえば、が複数のスレッドからアクセスされる場合、競合状態の正確なタイプとウィンドウは異なる可能性があります。a

その上、式の評価が副作用を引き起こす場合、それは副作用が 1 回観測される場合と 2 回観測される場合の違いです。これは、特定の状況下では大きな問題となり、速度だけでなくコードの正確性にも影響を与える可能性があります。

于 2013-11-05T16:54:53.080 に答える