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

C++ 從零開始:語句分類、CPU 執行模型與控制流實作原理

     編輯:關於C++

語句:動作的表達

C++ 僅能直接操作記憶體 (硬體資源需內嵌組語 __asm),語句即對記憶體的操作動作。兩大類:

  • 單一陳述式: 以 ; 結尾 (或以 } 結尾的區塊)。
  • 複合陳述式: { ... } 包裹多條單一陳述式,用於需單一語句處放入多條情況。

CPU 執行機器碼的基本循環

  1. 機器碼 (二進位) 載入記憶體,每條指令有位址。
  2. CPU 專用暫存器 指令指標 (IP/PC) 記錄下一條指令位址。
  3. 取指:讀取 IP 指向位址的指令碼。
  4. 解碼/執行:依指令類型執行運算、存取記憶體、控制流跳轉等。
  5. 更新 IP:IP += 指令長度 (循序執行) 或 IP = 目標位址 (跳轉指令)。
  6. 循環往複。

高階語言控制結構 (if、for、switch) 最終皆編譯為條件/無條件跳轉指令操作 IP。

六種語句分類

類別產生機器碼說明
宣告語句否引入名稱、型別資訊,供編譯器語義分析
定義語句視情況變數定義 (可能產生初始化碼)、函數/類別定義
運算式語句是運算式; — 利用運算子進行記憶體運算/賦值
指令語句是控制流關鍵字 (if, switch, for, goto...)
預處理語句否#include, #define... — 預處理器處理
註解語句否給人看,編譯器忽略

空語句 ; 或 {} 不產生碼,僅滿足語法需求。

註解語句

  • // 單行:至行尾。
  • /* ... */ 區塊:可跨行、可置於語句內部。
  • // 後不可再有代碼;/* */ 結束後代碼繼續編譯。

跳轉語句:goto 與標號


long a = 1;    // 假設位址 3000
P1:            // 標號值 = 3005
a += 1;        // 位址 3005
P2:            // 標號值 = 3009
b *= a;        // 位址 3009
goto P2;       // 將 IP 設為 3009
  • 標號:標識符: — 屬語句修飾符,非獨立語句,不可單獨放在區塊尾 (需修飾後續語句)。
  • goto 直接修改 IP,破壞結構化程式設計,現代 C++ 極少直接使用。

判斷語句

if-else


if (a < 10) goto P1; // 條件非零執行語句1,否則語句2
// 等價於
if (a - 10) goto P1; // 非零即真,但可讀性差
  • 條件為運算式,非零真、零假。
  • else 匹配最近的未配對 if (非縮排決定)。
  • if (a) long c; 合法但 c 作用域僅限該語句 (下篇講作用域)。

switch — 跳轉表實作


switch (a + 3) {
    case 2: case 3: a++; break;
    case 1: a *= a; break;
    default: a--;
}
  • 條件、case 標簽必為整數型別 (用於陣列索引/偏移)。
  • case 必為編譯期常數 (編譯器構建跳轉表需知位置)。
  • 實作: 編譯器建立位址陣列 Addr[case值 - 最小值],switch 變為 goto Addr[expr - base] — O(1) 分派。
  • 優化:case 值宜連續/密集,避免巨大稀疏表 (編譯器可能退化為 if-else 鏈)。
  • break 跳出 switch;無 break 則貫穿執行下一 case。

迴圈語句 — 結構化跳轉的語法糖

for — 計數器驅動


for (long a = 1, b = 1; a <= 10; ++a, ++b) b *= a; // 初始化; 條件; 迭代
// a,b 作用域限於 for 內 (標準)
for (;;); // 無限迴圈
  • 初始化可為變數定義 (僅限變數定義,不可結構/類別/函數定義)。
  • 三部份皆可省略。
  • 編譯器易將計數器優化至暫存器。

while — 條件前測


while (std::cin >> value) sum += value; // 串流狀態作為條件
  • 條件為零時零次執行。

do-while — 至少一次


do { /* 體 */ } while (condition); // 注意分號
  • 主體保證至少執行一次。

迴圈控制:break / continue


for (int i=0; i<10; ++i) {
    if (i%3==0) continue; // 跳過本次,執行 ++i
    if (i%7==0) break;    // 跳出整個 for
}
  • continue:跳至迭代運算 (for) 或條件判斷 (while/do-while)。
  • break:跳出最內層迴圈或 switch。
  • 巢狀結構中僅影響直接所屬層級。

巢狀與 goto 陷阱


for (long i=a; i<10; ++i)
    for (long j=0; j<10; ++j) {
        if (j%3==0) continue; // 影響 j 迴圈
        if (j%7==0) break;    // 影響 j 迴圈
        if (i*j) { a=i*j; goto P1; } // 跳出雙層迴圈 (不推薦)
    }
P1: ...
  • goto 破壞迴圈結構,難以維護,僅在極罕見情況 (如多層迴圈異常跳出) 考慮,並加詳細註解。
  • 變數 j 在內層迴圈定義,每次外層迭代重新定義 (作用域規則下篇詳述)。

本章核心觀念

  1. 原始碼 → 機器碼 → 記憶體 → CPU 依 IP 循序/跳轉執行。
  2. 所有高階控制結構本質是對 IP 的受控修改。
  3. 理解實作原理 (跳轉表、IP 操作、作用域) 有助於優化、除錯、看懂他人代碼。
  4. 寫出高效代碼同時保持可讀性,是工程師基本素養。

下章將引入作用域、生命週期、型別系統等核心概念,奠定進階 C++ 基石。

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