錯誤代碼
for (n = 100; n <= 200; ) {
for (i = 2; i <= n - 1; i++) {
if ((n % i) == 0) break;
}
if (i = n) { // 錯誤:賦值而非比較
printf("%d ", n);
// ...
}
n = n + 1;
}
錯誤分析
if (i = n) 是賦值運算,將 n 指派給 i
- 賦值運算式的值為被指派的值 (
n),非零即為 true
- 導致每個
n 都進入 if 區塊被輸出
修正
if (i == n) { // 比較運算子
printf("%d ", n);
// ...
}
完整修正程式碼
#include <stdio.h>
#include <math.h>
int main() {
int n, i, count = 0;
for (n = 100; n <= 200; n++) {
int isPrime = 1;
// 優化:只需檢查到 sqrt(n)
for (i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
isPrime = 0;
break;
}
}
if (isPrime) {
printf("%d ", n);
if (++count % 10 == 0) printf("\n");
}
}
return 0;
}
優化技巧總結
| 優化點 | 原始 | 改進 | 效能提升 |
| 內層迴圈上限 | n-1 | sqrt(n) | O(n) → O(√n) |
| 偶數跳過 | 檢查所有數 | 2 以外只檢查奇數 | 減半 |
| 篩法 | 試除法 | 埃拉托斯特尼篩 | O(n log log n) |
常見運算子混淆速查
| 運算子 | 名稱 | 範例 | 結果 |
= | 賦值 | a = 5 | a 變 5,運算式值 5 |
== | 比較 | a == 5 | true/false,a 不變 |
+= | 加賦值 | a += 3 | a = a + 3 |
++ | 遞增 | a++ / ++a | a = a + 1 |
編譯器警告
啟用 -Wall -Wextra (GCC/Clang) 或 /W4 (MSVC) 會對 if (i = n) 發出警告:warning: suggest parentheses around assignment used as truth value
- 上一篇文章: Java 匿名內部類訪問外部局部變量:final 關鍵字與 JLS 規範深度解析
- 下一篇文章: C 語言一維陣列大小限制:堆疊空間與動態配置解析
Copyright ©
程式碼之家 All Rights Reserved