C++ 僅能直接操作記憶體 (硬體資源需內嵌組語 __asm),語句即對記憶體的操作動作。兩大類:
; 結尾 (或以 } 結尾的區塊)。{ ... } 包裹多條單一陳述式,用於需單一語句處放入多條情況。高階語言控制結構 (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。
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 在內層迴圈定義,每次外層迭代重新定義 (作用域規則下篇詳述)。下章將引入作用域、生命週期、型別系統等核心概念,奠定進階 C++ 基石。