語法書 / AA 競程語法書 下冊 / 第十一單元 / 本單元常犯錯誤總覽

本單元常犯錯誤總覽

# 錯誤描述 錯誤類型 ✗ 錯誤寫法 ✓ 正確寫法
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