Сравнение переменных - PullRequest
       16

Сравнение переменных

1 голос
/ 22 марта 2010

Следующий 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 ]

2 голосов
/ 22 марта 2010

Сравнение значений с ceq С MSDN :

Если они равны, целое значение 1 (int32) помещается в стек оценки; в противном случае 0 (int32) помещается в стек оценки.

Второй ceq проверяет, не было ли первое сравнение неудачным, если это так, он переходит к точке выхода.

2 голосов
/ 22 марта 2010

Второй опкод ceq сравнивает результат первого с 0.(false)

Этот результат затем помещается в переменную, загружается из переменной, и, если это было true, вызов WriteLine пропускается.

Я быПредположим, что режим Release генерирует более эффективный код, но мне лень проверять.

...