程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 《C# to IL》第三章 選擇和循環(7)

《C# to IL》第三章 選擇和循環(7)

編輯:關於C語言

“小於等於”(<=)和“大於等於 ”(>=)的實現有一點復雜。實際上它們都具有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
}
}

Output

True

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved