本單元常犯錯誤總覽
| # | 錯誤描述 | 錯誤類型 | ✗ 錯誤寫法 | ✓ 正確寫法 |
|---|---|---|---|---|
| 1 | 比較函式相等時回傳 true | RE/WA/TLE(UB) | return x <= y; |
return x < y; |
| 2 | sort 範圍少一格,最後一個沒排到 | Wrong Answer | sort(a, a + n - 1); |
sort(a, a + n); |
| 3 | 1-base 陣列忘了兩端都 +1 | Wrong Answer | sort(a + 1, a + n); |
sort(a + 1, a + n + 1); |
| 4 | 對 vector 直接 sort | 編譯錯誤 | sort(v); |
sort(v.begin(), v.end()); |
| 5 | 對 C 字串陣列 sort 期待字典序 | 比到指標/編譯錯誤 | char *w[3]; sort(w, w + 3); |
改用 string 陣列或 vector<string> |
| 6 | greater 角括號型態寫錯 | 順序錯亂 | double 陣列配 greater<int>() |
greater() 讓編譯器自己推 |
| 7 | 一行宣告多個指標漏了 * |
編譯錯誤/邏輯錯誤 | int *a, b;(b 不是指標) |
int *a, *b; |
| 8 | 計數排序遇到負數直接當索引 | UB(越界) | cnt[x]++; 而 x 可能 < 0 |
先平移成非負再登記 |
| 9 | 指標跳格忘了加括號 | 值算錯 | *p + 2(取值再加 2) |
*(p + 2)(跳兩格再取值) |
| 10 | 指標參數在函式裡忘了寫 * |
外面的變數沒被改到 | a = b;(只換手上的位置) |
*a = *b; |
| 11 | 用指標版函式時忘了傳位置 | 編譯錯誤 | swap_ptr(x, y); |
swap_ptr(&x, &y); |
第 2 條看一個例子:int a[5] = {4, 2, 5, 3, 1}; 執行 sort(a, a + 5 - 1); 後陣列是 2 3 4 5 1——前四個排得好好的,a[4] 原地不動,這種「幾乎有排」的輸出是此錯誤的招牌症狀。第 5 條補充:const char *w[3] = {"pear", "apple", "banana"}; 排完輸出仍是 pear apple banana——比較的是指標的數值(記憶體位置),跟字典序無關;二維字元陣列 char w[3][10] 直接 sort 則根本過不了編譯(陣列不能整個指派,8.8 提過)。字串排序,交給 string。