現在我們將研究IL如何處理條件操作符。讓我們考慮C#中的 語句j>i16。IL首先把值j放到棧上,也就是常量值16的前面。隨後它會調用cgt操作,這是它首次在我 們的源代碼中出現。這個指令檢查棧上的第1個值是否大於第2個。如果是,那麼它會把值1(TRUE)放到 棧上,否則它會把值0(FALSE)放到棧上。這個值隨後被存儲到變量i中。使用WritleLine函數,就會生 成布爾值的輸出,從而我們看到顯示True。
同樣,操作符<被轉換為clt指令,它會檢查棧上的 第1個值是否小於第2個。從而我們看到IL具有它自己的一套邏輯操作符,對基本的邏輯運算進行內部處理 。
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
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
}
}
Output
False
操作符==就是EQUALITY操作符。它也需要棧上的2個操作數 (Operand)來檢查相等性。此後它使用ceq指令來檢查相等性。如果相等,它會把值1(TRUE)放到棧上 ,如果不相等,它會把值0(FALSE)放到棧上。指令ceq是IL的邏輯指令集的不可缺少的一部分。
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
cgt
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
}
}
Output
False