程式的靈魂在於流程控制。本章涵蓋條件判斷、三種迴圈結構、跳轉陳述式,以及避免常見陷阱的實戰技巧。
if (條件運算式)
單一陳述式; // 單行可省略大括號
if (條件運算式) {
陳述式1;
陳述式2; // 多行必須用大括號
}
if (x == 10); // 錯誤!這是空陳述式
DoSomething(x); // 無條件執行
編譯器不會警告,因為語法合法。習慣在 if 後直接加 { 可避免此錯誤。
bool fileGood = OpenFile();
if (fileGood) // 等同 fileGood == true
ReadData();
if (!fileGood) // 等同 fileGood == false
ReportError();
非零整數、非空指標在條件中視為 true。
if (x == 20) {
DoSomething(x);
} else {
DoDifferentThing(x);
}
// 多條件鏈
if (cond1) {
// ...
} else if (cond2) {
// ...
} else {
// 以上皆非
}
所有迴圈共同要素:初始化 → 條件判斷 → 執行主體 → 狀態更新。
for (初始化; 條件; 更新) {
迴圈主體;
}
for (int i = 0; i < 10; ++i) {
cout << "Iteration " << i << endl;
}
// 多變數初始化與更新
for (int i = 0, j = 100; i < j; ++i, --j) { ... }
// 無限迴圈
for (;;) { ... }
// 範圍 for (C++11,適用容器/陣列)
for (auto& item : container) { ... }
while (條件) {
主體;
}
適合「次數未知、依條件持續」場景,如讀取檔案直到 EOF。
do {
主體;
} while (條件);
常用於選單輸入驗證。
| 陳述式 | 作用 |
|---|---|
| break | 立即跳出當前最內層迴圈或 switch |
| continue | 跳過本次迭代剩餘部分,直接進入下一次條件判斷 |
| goto | 無條件跳轉(極度不推薦,破壞結構化) |
for (int i = 0; i < 100; ++i) {
if (i % 7 == 0) continue; // 跳過 7 的倍數
if (i > 50) break; // 超過 50 結束迴圈
Process(i);
}
C++ 無標籤 break,跳出多層迴圈常用旗標或函數返回:
bool done = false;
for (int i = 0; i < 10 && !done; ++i) {
for (int j = 0; j < 10; ++j) {
if (Found(i, j)) { done = true; break; }
}
}
// 或封裝為函數直接 return
| 錯誤 | 正確做法 |
|---|---|
for (int i=0; i<=n; ++i) 存取 a[i] | i < n(0-based 索引) |
| 修改迴圈計數器 | 避免在主體中修改 i,改用 while |
| 浮點數作迴圈條件 | 改用整數計數,或設定容差比較 |
| 無限迴圈無退出條件 | 確保 break/return 條件必達 |
掌握 if-else 分支與三種迴圈的適用場景,養成「大括號不省略」、「條件邊界仔細檢查」的習慣。下一章將介紹函數、陣列與字串處理。