私は現在、C# の演算子と式について学んでおり、変数の値を 5 ずつ増やしたい場合は、2 つの異なる方法で実行できることを理解しました:a = a + 5
とa += 5
. どうやら、2 番目の方法は、書くのが簡単で速く、読むのがより快適です。ただし、コンピューターに関してはa += 5
、a = a + 5
? 式の長いバージョンよりもコンパイルと実行にかかる時間が短いですか?
2 に答える
しかし、コンピュータ的には、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
それは何a
であるかによって異なります。 2回 a = a + 5
評価します。正確に1 回評価します。a
a += 5
a
a
が整数の場合、厳密にはすべての場合ではありませんが、ほとんどの場合、その違いは問題にならない可能性があります。たとえば、が複数のスレッドからアクセスされる場合、競合状態の正確なタイプとウィンドウは異なる可能性があります。a
その上、式の評価が副作用を引き起こす場合、それは副作用が 1 回観測される場合と 2 回観測される場合の違いです。これは、特定の状況下では大きな問題となり、速度だけでなくコードの正確性にも影響を与える可能性があります。