int i = 1;
while (i <= 100) {
if (i % 2 == 0)
printf("%d", i);
i++; // 為什麼不在printf前面?
}
迭代1: i=1 → 1%2≠0 → 不打印 → i=2
迭代2: i=2 → 2%2==0 → 打印2 → i=3
迭代3: i=3 → 不打印 → i=4
迭代4: i=4 → 打印4 → i=5
...
迭代100: i=100 → 打印100 → i=101 → 循環結束
if (i%2==0)檢查的是遞增前的i。i++在if塊之後,只影響下一次循環的i值。while (i <= 100) {
i++; // 先遞增
if (i % 2 == 0) printf("%d", i);
}
// i初始1 → 首輪變2 → 打印2 → 正確
// 但語義變為「檢查下一個數」,邏輯不直觀
循環變量更新位置不影響結果,但影響代碼可讀性。標準模式:
初始化;
while (條件) {
循環體(使用當前變量);
更新變量; // 統一放在循環體末尾
}
這樣「檢查當前值 → 處理 → 移至下一值」語義最清晰,避免off-by-one錯誤。
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) printf("%d ", i);
}
for循環將初始化、條件、更新集中在一行,更適合已知次數迭代。