輸出指定範圍內的奇數是迴圈與條件判斷的經典練習。本文對比兩種常見思路,分析其效能差異與適用場景。
#include <stdio.h>
int main() {
for (int i = 1; i < 100; i += 2) {
printf("%d ", i);
}
return 0;
}
#include <stdio.h>
int main() {
for (int i = 1; i < 100; i++) {
if (i % 2 == 1) { // 或 (i & 1)
printf("%d ", i);
}
}
return 0;
}
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
| 維度 | 方法一 (步長 2) | 方法二 (判斷奇偶) |
|---|---|---|
| 迴圈次數 | 50 次 | 99 次 |
| 分支預測 | 無條件分支 | 每次迴圈需判斷 |
| 指令數 | 極少 | 包含模運算/位運算 |
| 適用場景 | 已知步長規律 | 條件複雜、無固定步長 |
| 可讀性 | 意圖明確 | 邏輯通用 |
(i & 1) 比 (i % 2 == 1) 更快,編譯器通常會自動優化。-O2 時,現代編譯器可能將方法二優化為方法一的機器碼。if 在固定模式下預測準確率高,但仍有微小開銷。void print_odds(int start, int end) {
// 確保起始為奇數
if (start % 2 == 0) start++;
for (int i = start; i <= end; i += 2) {
printf("%d ", i);
}
}
**方法一是最佳解**:迴圈次數減半、無分支、意圖清晰。方法二適用於「條件不規則、無法用步長描述」的場景。初學者應養成「尋找數學規律、減少不必要計算」的優化直覺。