for 迴圈將初始化、條件判斷、增量更新集中在一行,是處理已知次數迭代的首選結構。Turbo C 2.0 完整支援 ANSI C for 語義。
for (初始化; 條件表達式; 增量運算式)
語句; // 或複合語句 { ... }
1. 執行「初始化」(僅一次) 2. 評估「條件表達式」 ├─ 真(非0) → 執行「語句」 → 執行「增量運算式」 → 回步驟2 └─ 假(0) → 結束迴圈,執行後續代碼
int sum = 0;
for (int i = 1; i <= 10; ++i) // C99 允許在初始化處宣告變數
sum += i;
printf("Sum = %d\n", sum); // 55
| 變體 | 語法 | 適用場景 |
|---|---|---|
| 省略初始化 | for (; i < n; ++i) | 迴圈變數在外部已初始化 |
| 省略條件 | for (;;) 或 for (; ; ++i) | 無限迴圈,內部用 break 跳出 |
| 省略增量 | for (i=0; i | 增量邏輯複雜,放在迴圈體內 |
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
for (int k = 0; k < 2; ++k)
printf("%d %d %d\n", i, j, k);
輸出(8 組排列):
0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1
關鍵點:內層迴圈完整跑完一次,外層才推進一步。時間複雜度為各層迴圈次數乘積。
for (int i = 0, j = 10; i < j; ++i, --j) {
printf("%d %d\n", i, j);
}
for (int i = 0; i < 5; ++i) { /* i 可見 */ }
// i 在此處不可見(編譯錯誤若使用)
Turbo C 2.0 (C89) 不支援,需在區塊開頭宣告。
#define FOR_EACH(arr, var) \
for (int _i = 0, *var = &(arr)[0]; _i < sizeof(arr)/sizeof(arr[0]); ++_i, ++var)
int a[] = {1,2,3};
FOR_EACH(a, p) { printf("%d ", *p); }
| 陷阱 | 錯誤代碼 | 問題 | 修正 |
|---|---|---|---|
| 分號誤置 | for (i=0; i<10; ++i); stmt; | 迴圈體為空,stmt 只執行一次 | 移除分號 |
| 邊界錯誤 | for (i=0; i<=n; ++i) 存取 a[i] | 陣列越界 (0..n-1) | i < n |
| 修改迴圈變數 | 迴圈體內 i = 0 | 導致無限迴圈或邏輯錯誤 | 避免修改,或改用 while |
| 浮點數作計數器 | for (float f=0; f<1; f+=0.1) | 精度誤差導致次數不準 | 用整數計數,內部換算 |
| 無符號倒序 | for (unsigned i=n; i>=0; --i) | 永真 (i>=0 恆成立) | for (int i=n; i>=0; --i) 或 do { } while (i-- > 0) |
for vs while 選擇指南for(語義清晰、變數作用域可控)while(如讀檔直到 EOF、等待旗標變化)do-whilefor 迴圈以「初始化、條件、增量」三段式設計,將迭代控制邏輯集中暴露,是結構化程式設計的基石。掌握「三部分可空但分號必留、巢狀順序、邊界條件、避免浮點計數」等核心技巧,並根據語義在 for/while/do-while 中選擇,能寫出無 Bug、易閱讀的迴圈代碼。