/* 片段 1 */
i = 1; k = 0;
while (i <= n - 1) {
@ k += 10 * i; i++;
}
/* 片段 2 */
i = 1; k = 0;
do {
@ k += 10 * i;
i++;
} while (i <= n - 1);
| 片段 | 初始 i | 條件判斷時機 | 迴圈結束條件 | 執行次數 |
|---|---|---|---|---|
| 1 (while) | 1 | 迴圈前 | i 變為 n 時 (i <= n-1 為假) | n - 1 |
| 2 (do-while) | 1 | 迴圈後 | i 變為 n 時 (i <= n-1 為假) | n - 2 (n > 1 時) |
i = 1;
// 第 1 次檢查:1 <= n-1 ? 是 → 執行 @ → i=2
// 第 2 次檢查:2 <= n-1 ? 是 → 執行 @ → i=3
// ...
// 第 n-1 次檢查:n-1 <= n-1 ? 是 → 執行 @ → i=n
// 第 n 次檢查:n <= n-1 ? 否 → 結束
// 共執行 n-1 次
i = 1;
do {
// 第 1 次:無條件執行 @ → i=2
// 第 2 次檢查:2 <= n-1 ? 是 → 執行 @ → i=3
// ...
// 第 n-2 次檢查:n-2 <= n-1 ? 是 → 執行 @ → i=n-1
// 第 n-1 次檢查:n-1 <= n-1 ? 是 → 執行 @ → i=n
// 第 n 次檢查:n <= n-1 ? 否 → 結束
// 共執行 n-1 次?等等!
} while (i <= n - 1);
關鍵差異:do-while 至少執行一次。若 n = 1:
while (1 <= 0) 偽 → 0 次。do { @ } while (2 <= 0) → 執行 1 次。若 n = 2:
i=1 滿足 → 執行 1 次 → i=2 不滿足 → 共 1 次 (n-1)。i=2;檢查 2 <= 1 偽 → 共 1 次 (n-1)。若 n = 3:
i=1,2 共 2 次 (n-1)。i=2;檢查 2<=2 真 → 執行 @ → i=3;檢查 3<=2 偽 → 共 2 次 (n-1)。結論:原答案「片段 2 執行 n-2 次」僅在 n > 2 時成立。嚴謹說法應為:
max(0, n-1) 次。(n > 1) ? n-1 : 1 次 (至少 1 次)。while (fgets(...)))。面試熱門變體
「請寫出等價的 for 迴圈」
片段 1 →for (i=1; i <= n-1; i++) @;
片段 2 →for (i=1; ; i++) { @; if (i > n-1) break; }(較繁瑣,說明 do-while 語義獨特)。