我使用ILDASM查看了一个看起来像这样的.exe文件:
int a = 2;
Int32 b = 1;
if(b == 1)
{
}
现在,CIL代码看起来是这样的:
IL_0005: ldloc.1
IL_0006: ldc.i4.1
IL_0007: ceq
IL_0009: ldc.i4.0
IL_000a: ceq
IL_000c: stloc.2
我知道首先加载的是b(存储在[1]位置),然后是一个常数1,它们被比较。我不理解的是为什么要加载另一个值为0的常数进行比较,然后再将该比较结果存储。
由于第一个比较已经产生了一个真值,检查这个值是否为0会翻转结果,对吗?
我的问题是:为什么要反转结果? 我认为这与我使用的“==”操作符有关,我的理论是它返回差异。如果这个差异是0,那么这些值是相同的,因此结果应该是true。但是0代表false,所以它需要被反转。
我似乎找不到关于这个主题的任何信息,只是一些关于类似“==~”的操作符的内容。 希望你能为我解惑 :)
最好的问候,
Wilsu
PS:这是完整的代码:
.method private hidebysig instance void Form1_Load(object sender,
class [mscorlib]
System.EventArgs e) cil managed
{
// Code size 19 (0x13)
.maxstack 2
.locals init ([0] int32 a,
[1] int32 b,
[2] bool CS$4$0000)
IL_0000: nop
IL_0001: ldc.i4.2
IL_0002: stloc.0
IL_0003: ldc.i4.1
IL_0004: stloc.1
IL_0005: ldloc.1
IL_0006: ldc.i4.1
IL_0007: ceq
IL_0009: ldc.i4.0
IL_000a: ceq
IL_000c: stloc.2
IL_000d: ldloc.2
IL_000e: brtrue.s IL_0012
IL_0010: nop
IL_0011: nop
IL_0012: ret
} // end of method Form1::Form1_Load
stloc.2
甚至是什么意思都不明显... - Marc Gravell