以下C#-snippet:
var x = 1;
var y = 1;
if (x == y)
Console.Write("True");
生成此MSIL:
.locals init (
[0] int32 x,
[1] int32 y,
[2] bool CS$4$0000)
L_0000: nop
L_0001: ldc.i4.1
L_0002: stloc.0
L_0003: ldc.i4.1
L_0004: stloc.1
L_0005: ldloc.0
L_0006: ldloc.1
L_0007: ceq
L_0009: ldc.i4.0
L_000a: ceq
L_000c: stloc.2
L_000d: ldloc.2
L_000e: brtrue.s L_001b
L_0010: ldstr "True"
L_0015: call void [mscorlib]System.Console::Write(string)
L_001a: nop
L_001b: ret
为什么有两个ceq
来电?
由于
答案 0 :(得分:2)
第二个ceq
操作码将第一个操作码的结果与0
进行比较。 (false
)
然后将此结果放入从变量加载的变量中,如果是true
,则跳过WriteLine
调用。
我认为发布模式会生成更高效的代码,但我懒得检查。
答案 1 :(得分:2)
关于将值与[{1}}来自MSDN:
进行比较如果它们相等,则将整数值1(int32)推送到评估堆栈;否则0(int32)被推到评估堆栈上。
第二个ceq
检查第一个比较是否失败,如果是,则跳转到退出点。