《C# to IL》第三章 选择和循环
2009-06-01 08:31:05 来源:WEB开发网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
}
}
- ››Illustrator CS6 打造孔雀花纹的字体
- ››TOscilloscope 仿Windows任务管理器CPU使用记录组...
- ››Illustrator教程:设计制作几何花瓣LOGO
- ››Illustrator实例教程:漂亮证卡变幻线的制作
- ››Illustrator文字教程:制作漂亮质感描边字
- ››Illustrator鼠绘:渐变工具运用绘制金属闹钟
- ››Illustrator鼠绘:教你画一个可爱卡通宝宝教程
- ››Illustrator简单四步做透明气泡教程
- ››Illustrator教程:制作漂亮的新货吊牌
- ››Illustrator教程:改变圆角矩形中一个圆角半径
- ››Illustrator教程:如何用网格工具绘制花瓣
- ››Illustrator涂抹命令打造文字草图特效
更多精彩
赞助商链接