我有以下功能:
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
如果为真,将分支。让我困惑的是这条线IL_0003
。它的说法是,IL_0010
如果它是真的,它应该分支到线。不过,在我的 C# 代码中,我使用 an&&
来比较两个表达式,然后我的程序流应该跳转到下一个if
. 好像倒退了。从发布的 MSIL 代码来看,它似乎在检查我的操作是否正确,如果是,则跳转到我的下一个if
块,这在逻辑上是错误的。有人可以解释我错过了什么吗?