代码之家  ›  专栏  ›  技术社区  ›  alexn

变量比较

  •  1
  • alexn  · 技术社区  · 14 年前

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

    谢谢

    2 回复  |  直到 14 年前
        1
  •  2
  •   SLaks    14 年前

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

    然后将此结果放入变量中,从该变量加载,如果它是 true , the WriteLine 呼叫被跳过。

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

        2
  •  2
  •   Saulius Valatka    14 年前

    关于将值与 ceq MSDN :

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

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