一、選擇結構:if 系列
1. 單分支 if
if (條件) {
// 條件為真執行
}
2. 雙分支 if-else
if (條件) {
// 真
} else {
// 假
}
3. 多條件 if-else if-else
if (條件1) {
} else if (條件2) {
} else if (條件3) {
} else {
// 以上都不滿足
}
完整示例
#include <iostream>
int main() {
int i = 13;
if (i == 10) {
std::cout << "i 等於 10\n";
} else if (i == 11) {
std::cout << "i 等於 11\n";
} else if (i == 12) {
std::cout << "i 等於 12\n";
} else {
std::cout << "i 不是 10/11/12\n"; // 輸出此行
}
return 0;
}
二、循環結構:while / do-while
1. while 先判斷後執行
while (條件) {
// 條件為真重複執行
}
2. do-while 先執行後判斷 (至少執行一次)
do {
// 執行體
} while (條件);
示例
int i = 10;
while (i < 20) { i++; } // 循環結束 i=20
do { i++; } while (i == 19); // 條件假,僅執行一次,i=21
三、多路選擇:switch
switch (表達式) {
case 常量1: { 語句; break; }
case 常量2: { 語句; break; }
default: { 語句; }
}
- 表達式類型:整型、字符型、枚舉型 (C++11 類類型需單一轉換函數)。
- case 標簽必須是**編譯期常量**。
- break 至關重要:缺失會「貫穿」執行下一 case。
- default 可選,建議保留處理意外值。
示例
char c = 'L';
switch (c) {
case 'A': std::cout << "A\n"; break;
case 'B': std::cout << "B\n"; break;
case 'C': std::cout << "C\n"; break;
default: std::cout << "其他: " << c << '\n'; // 輸出 "其他: L"
}
四、計數循環:for
for (初始化; 條件; 迭代更新) {
// 循環體
}
- 初始化:僅執行一次,可聲明變量 (作用域限於 for 內)。
- 條件:每次迭代前檢查,假則退出。
- 迭代更新:每次循環體結束後執行。
- 三部分均可為空:`for (;;)` 為無限循環。
示例
for (int i = 0; i < 10; ++i)
std::cout << "i = " << i << '\n';
五、無條件跳轉:goto (慎用)
for (int i = 1; i < 10; ++i) {
for (int j = 1; j < 10; ++j) {
if (i == 6 && j == 6) goto END;
std::cout << "i=" << i << ", j=" << j << '\n';
}
}
END:
std::cout << "跳出雙層循環, i=" << i << '\n';
總結對比表
| 語句 | 類型 | 關鍵特點 | 最佳實踐 |
| if/else if/else | 選擇 | 條件靈活、支持任意布爾表達式 | 條件簡單時優先;複雜多條件考慮 switch 或查表 |
| switch | 多路選擇 | 整型/字符常量匹配、跳轉表優化快 | 枚舉值、狀態機、命令分發首選 |
| while | 循環 | 先檢查、不定次數 | 條件在循環前已知或循環內更新 |
| do-while | 循環 | 至少一次、後檢查 | 菜單交互、至少一次嘗試 |
| for | 計數循環 | 初始化/條件/更新集中、範圍 for (C++11) 遍歷容器 | 已知次數、遍歷容器/範圍首選 |
| goto | 跳轉 | 無條件、破壞結構 | 極少用;僅用於多層 break 或錯誤統一出口 |
最佳實踐建議
- 優先使用 **範圍 for** (`for (auto& x : container)`) 遍歷容器,避免下標越界。
- 條件判斷盡量**扁平化**,避免超過 3 層嵌套 `if`,提取函數或衛語句 (`if (!cond) return;`)。
- `switch` 針對枚舉類型時,開啟編譯器警告 (`-Wswitch-enum`),確保覆蓋所有枚舉值。
- 循環變量**盡量縮小作用域** (C++11 `for (int i=0; ...)`)。
- **拒絕 goto**,除非有極其充分理由且經過代碼審查。