B. 常犯錯誤總表
本表整合書中所有常犯錯誤,按類型分為編譯錯誤 (CE)、執行錯誤 (RE)、邏輯錯誤 (WA) 三大類,並按錯誤發生的頻率排列。
¶I. 編譯錯誤 (Compile Error)
| 錯誤 # | 錯誤描述 | 對應單元 | ✗ 錯誤寫法 | ✓ 正確寫法 |
|---|---|---|---|---|
| CE-1 | 忘記分號 | 1, 3, 4, 7 | cout << x |
cout << x; |
| CE-2 | cin/cout 箭頭用反 | 1 | cout >> x; 或 cin << x; |
cout << x; 或 cin >> x; |
| CE-3 | 忘記宣告變數 | 2, 3 | x = 10; |
int x; x = 10; |
| CE-4 | 宣告變數在使用之後 | 2 | 使用 x 後才 int x; |
先宣告,後使用 |
| CE-5 | 使用全形符號 | 1, 2, 3 | int a = 10; |
int a = 10; |
| CE-6 | 大括號未配對或位置錯誤 | 1, 3, 4, 7 | if (x > 0) { cout << x (缺閉括號) |
if (x > 0) { cout << x; } |
| CE-7 | 忘記 #include |
1 | 直接用 cout |
#include <iostream> |
| CE-8 | 忘記 using namespace std; |
1 | cout << x; |
std::cout << x; 或加 using |
| CE-9 | 全域變數撞名 | 1 | int data; (在某些 OJ 撞名) |
改變數名稱或用局部變數 |
¶II. 執行錯誤 (Runtime Error)
| 錯誤 # | 錯誤描述 | 對應單元 | ✗ 錯誤寫法 | ✓ 正確寫法 |
|---|---|---|---|---|
| RE-1 | 陣列索引越界存取 | 6 | int a[10]; a[10] = 5; |
a[9] = 5; |
| RE-2 | 整數除以零 | 2, 4 | int x = 5 / 0; |
檢查除數是否為零 |
| RE-3 | 陣列開太小導致越界 | 6 | int a[10]; for (i=0; i<=10; i++) a[i]=i; |
int a[11]; |
¶III. 邏輯錯誤 (Wrong Answer)
| 錯誤 # | 錯誤描述 | 對應單元 | ✗ 錯誤寫法 | ✓ 正確寫法 |
|---|---|---|---|---|
| WA-1 | = 和 == 搞混 |
3 | if (x = 5) { ... } |
if (x == 5) { ... } |
| WA-2 | 指派運算子方向搞反 | 2 | 10 = x; |
x = 10; |
| WA-3 | 變數大小寫混用 | 2, 3, 4 | int myVar; cout << myvar; |
cout << myVar; |
| WA-4 | Dangling else(else 與 if 匹配錯誤) | 3 | cpp<br/>if (x > 0)<br/> if (x == 5)<br/> cout << "5";<br/>else<br/> cout << "not 5"; |
加大括號澄清意圖 |
| WA-5 | 連寫比較運算子(Python 習慣) | 3 | if (a < b < c) |
if (a < b && b < c) |
| WA-6 | && / || 優先級錯誤 |
3 | if (x < 0 || x > 10 && x % 2 == 0) (優先級) |
if ((x < 0 || x > 10) && x % 2 == 0) |
| WA-7 | 迴圈 off-by-one 錯誤 | 4 | for (int i = 0; i <= n; i++) a[i] = i; (n=10 但陣列只到 9) |
for (int i = 0; i < n; i++) |
| WA-8 | 無窮迴圈 | 4 | for (int i = 0; i < n; i--) { ... } |
for (int i = 0; i < n; i++) |
| WA-9 | 迴圈邊界 < 和 <= 搞混 |
4 | for (i = 1; i < n; i++) (應該到 n) |
for (i = 1; i <= n; i++) |
| WA-10 | continue 跳過必要操作 | 4 | cpp<br/>for (i=0; i<n; i++) {<br/> if (a[i] > 0) continue;<br/> sum += a[i];<br/>} (應該累加負數) |
重新整理邏輯,確保必要操作不被跳過 |
| WA-11 | 變數 i/j/k/n/m 搞混 | 4, 6 | for (int i=0; i<n; i++) a[j]++; |
a[i]++ |
| WA-12 | 0~n-1 和 1~n 索引搞混 | 4, 6 | 陣列是 0-based,但題目要求 1-based | 先確認題目的索引約定 |
| WA-13 | 整數溢位 | 2 | int a = 2000000000; int b = a + a; |
long long a = 2000000000LL; long long b = a + a; |
| WA-14 | 未初始化變數 | 2, 4, 6, 7 | int sum; for (...) sum += a[i]; |
int sum = 0; |
| WA-15 | 函式忘記 return | 7 | cpp<br/>int add(int a, int b) {<br/> int c = a + b;<br/>} |
cpp<br/>int add(int a, int b) {<br/> return a + b;<br/>} |
| WA-16 | Pass by value 修改無效 | 7 | cpp<br/>void inc(int x) { x++; }<br/>int a = 5; inc(a);<br/>cout << a; (輸出 5) |
cpp<br/>void inc(int& x) { x++; }<br/> |
| WA-17 | max/min 參數型態不一致 | 7 | long long ans = max(1000000000, 2000000000); |
long long ans = max(1000000000LL, 2000000000LL); |
| WA-18 | ^ 不是指數運算子 |
2 | int x = 2 ^ 10; (是 XOR,結果是 8) |
把乘法寫開,或用迴圈連乘:int x = 1; for (int i = 0; i < 10; i++) x *= 2; |
| WA-19 | 輸出格式錯誤(空格、換行) | 1 | cout << a << b << c; (無空格分隔) |
cout << a << " " << b << " " << c; |
| WA-20 | 多組測資忘記重新初始化 | 4, 6, 7 | 上一個測資的 sum 沒清零 |
在每組測資開始時 sum = 0; |