WEB开发网
开发学院软件开发C语言 《C# to IL》第三章 选择和循环 阅读

《C# to IL》第三章 选择和循环

 2009-06-01 08:31:05 来源:WEB开发网   
核心提示: OutputFalse“小于等于”(<=)和“大于等于”(>=)的实现有一点复杂,实际上它们都具有2个融合在一起的条件,《C# to IL》第三章 选择和循环(9),在>=的情况中,IL首先使用cgt指令来检查第1个数字是否

Output

False

“小于等于”(<=)和“大于等于”(>=)的实现有一点复杂。实际上它们都具有2个融合在一起的条件。

在>=的情况中,IL首先使用cgt指令来检查第1个数字是否大于第2个数字。如果是,它将返回值1,否则就返回值0。如果第1个条件是FALSE,那么ceq指令将会检查这2个数字是否相等。如果相等,它就返回TRUE,否则就返回FALSE。

让我们从一个稍微不同的角度来分析上面的IL代码。我们对这两个值19和16进行比较。在这个例子中,因为19大于16,所以指令cgt将会把值1放到栈上。

让我们在静态构造函数中将字段j的值修改为1。现在,由于数字1不大于16,所以cgt指令将把值FALSE或0放到栈上。此后,使用ldc指令把另一个0放到栈上。现在当ceq指令比较两个值时,因为它们都是0,所以它会返回TRUE。

现在,如果我们将j修改为16,cgt指令将返回FALSE,因为16不大于16。此后,由于使用ldc指令把值0放到栈上,这两个传递到ceq的值将都是0。由于0与0是相等的,所以返回值是1或TRUE。

如果你不能理解上面的解释,那么就从源代码中移除ldc.i4.0和ceq这两行,并观察输出。

a.cs

class zzz
{
static bool i;
static int j = 19;
public static void Main()
{
i = j != 16;
System.Console.WriteLine(i);
}
}

a.il

.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.field private static bool i
.field private static int32 j
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldsfld     int32 zzz::j
ldc.i4.s   16
ceq
ldc.i4.0
ceq
stsfld     bool zzz::i
ldsfld     bool zzz::i
call void [mscorlib]System.Console::WriteLine(bool)
ret
}
.method public hidebysig specialname rtspecialname static void .cctor() il managed
{
ldc.i4.s   19
stsfld int32 zzz::j
ret
}
}

上一页  4 5 6 7 8 9 10  下一页

Tags:to IL 第三章

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接