首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 到 IL 深度解析:第3章 選擇與循環 (12) - break 語句與 continue 的 IL 實現

     編輯:關於C語言

break 強制退出循環的 IL 邏輯

break 會強迫程式離開 for、while 或 do-while 循環。在 IL 中,這表現為無條件分支 br.s 跳轉到循環結束後的標籤(如 IL_0019 的 ret)。

範例:break 在 for 循環中的運作

以下 C# 程式在 i == 2 時執行 break,故僅輸出 1:

// C# 代碼
public class zzz {
    public static void Main() {
        int i;
        for (i = 1; i <= 10; i++) {
            if (i == 2)
                break;
            System.Console.WriteLine(i);
        }
    }
}

對應 IL 關鍵片段:

  • ldc.i4.1 / stloc.0:初始化 i=1。
  • br.s IL_0014:跳到條件檢查處。
  • IL_0004:循環體起始,載入 i 與 2 比較(bne.un.s)。
  • 若相等(i==2),br.s IL_0019 直接跳到 ret 退出循環。
  • 否則輸出 i,執行 i++,回到 IL_0014 檢查 i <= 10。
.method public hidebysig static void vijay() il managed {
    .entrypoint
    .locals (int32 V_0)
    ldc.i4.1
    stloc.0
    br.s IL_0014
    IL_0004: ldloc.0
    ldc.i4.2
    bne.un.s IL_000a
    br.s IL_0019          // break 跳出
    IL_000a: ldloc.0
    call void [mscorlib]System.Console::WriteLine(int32)
    ldloc.0
    ldc.i4.1
    add
    stloc.0
    IL_0014: ldloc.0
    ldc.i4.s 10
    ble.s IL_0004
    IL_0019: ret
}

輸出:1。

continue 的 IL 實現對比

同樣的循環若改用 continue,IL 會在條件成立時跳轉到循環尾部的遞增標籤(IL_0010),而非跳出循環。這印證了 break 與 continue 在 IL 層級只是跳轉目標不同。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved