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 

なぜ2つのceq呼び出しがあるのですか?

ありがとう

4

2 に答える 2

2

2 番目のceqオペコードは、最初のオペコードの結果を と比較し0ます。( false)

この結果は変数に入れられ、変数からロードされます。もしそうならtrueWriteLine呼び出しはスキップされます。

リリース モードではより効率的なコードが生成されると思いますが、確認するのが面倒です。

于 2010-03-22T15:09:09.133 に答える
2

ceqFrom MSDNとの値の比較について:

それらが等しい場合、整数値 1 (int32) が評価スタックにプッシュされます。それ以外の場合は、0 (int32) が評価スタックにプッシュされます。

2 番目ceqは、最初の比較が失敗したかどうかをチェックします。失敗した場合は、終了点にジャンプします。

于 2010-03-22T15:11:22.743 に答える