私は次の機能を持っています:
public string MyPhrase(int val)
{
if ((val %3 == 0) && (val % 6 == 0))
return "Fizz Bang";
if (val % 3 == 0)
return "Fizz";
if (val % 6 == 0)
return "Bang";
return "";
}
これをコンパイルしてIlDasmで表示すると、次の出力が得られます。
IL_0000: ldarg.1
IL_0001: ldc.i4.3
IL_0002: rem
IL_0003: brtrue.s IL_0010
IL_0005: ldarg.1
IL_0006: ldc.i4.6
IL_0007: rem
IL_0008: brtrue.s IL_0010
IL_000a: ldstr "Fizz Bang"
IL_000f: ret
IL_0010: ldarg.1
IL_0011: ldc.i4.3
IL_0012: rem
IL_0013: brtrue.s IL_001b
IL_0015: ldstr "Fizz"
IL_001a: ret
IL_001b: ldarg.1
IL_001c: ldc.i4.6
IL_001d: rem
IL_001e: brtrue.s IL_0026
IL_0020: ldstr "Bang"
IL_0025: ret
IL_0026: ldstr ""
IL_002b: ret
このページを見てからbrtrue
、trueの場合は分岐します。私を混乱させているのは線IL_0003
です。IL_0010
それが本当ならそれは行に分岐するべきであるというそのことわざ。ただし、C#コードでは&&
、プログラムフローが次の式にジャンプする前に、を使用して2つの式を比較していif
ます。後ろ向きに見えます。投稿されたMSILコードから、私の操作が真であるかどうかを確認しているように見えます。真である場合は、次のif
ブロックにジャンプします。これは論理的に間違っています。誰かが私が欠けているものを説明できますか?