R・田中一郎が久々にヒットを飛ばしてくれた。
比較と代入の演算子
http://blogs.wankuma.com/rti/archive/2009/04/20/171723.aspx
var i = 1;
var j = 0;
Console.WriteLine((j = i) == i);
比較演算子の左辺は、i と j どちらの値と比較しているのでしょう?
答えは i です。
やっぱ愛だよね~。
Debug バージョン は ldloc.0 dup ldloc.0 ceq と i のコピーと i を比較しています。
Release バージョン は最適化の結果そもそも j が出てきません。w
~~~~~~~~~~~
Debugバージョン。
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// コード サイズ 18 (0x12)
.maxstack 2
.locals init ([0] int32 i,
[1] int32 j)
IL_0000: nop
IL_0001: ldc.i4.1
IL_0002: stloc.0
IL_0003: ldc.i4.0
IL_0004: stloc.1
IL_0005: ldloc.0
IL_0006: dup
IL_0007: stloc.1
IL_0008: ldloc.0
IL_0009: ceq
IL_000b: call void [mscorlib]System.Console::WriteLine(bool)
IL_0010: nop
IL_0011: ret
} // end of method Program::Main
Releaseバージョン。
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// コード サイズ 12 (0xc)
.maxstack 2
.locals init ([0] int32 i)
IL_0000: ldc.i4.1
IL_0001: stloc.0
IL_0002: ldloc.0
IL_0003: ldloc.0
IL_0004: ceq
IL_0006: call void [mscorlib]System.Console::WriteLine(bool)
IL_000b: ret
} // end of method Program::Main