1

以下 C# 片段:

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电话?

谢谢

4

2 回答 2

2

第二个ceq操作码将第一个操作码的结果与0. ( false)

然后将此结果放入一个变量中,从变量中加载,如果是trueWriteLine则跳过调用。

我会假设发布模式生成更高效的代码,但我懒得检查。

于 2010-03-22T15:09:09.133 回答
2

关于与ceqFrom MSDN比较值:

如果它们相等,则将整数值 1 (int32) 压入评估堆栈;否则 0 (int32) 被推入评估堆栈。

第二个ceq检查第一次比较是否失败,如果是,则跳转到退出点。

于 2010-03-22T15:11:22.743 回答