## 來由 由於後面的題目會使用到更多東西,考慮到的方面也會比較多 所以為了不出現一些較基本的錯誤,在這裡複習+補充一下常出問題的地方 ## C++ ### 整數的 overflow 因為在 C++ 有多種整數的表現形式,比如 int、short、long long、char 每個表現形式都有自己的範圍,如果超出範圍的話就會 overflow 最簡單的處理方式就是都使用 long long,不過要注意以下情況 ```cpp= long long x = 1 << 40 ; // wrong long long x = (long long) 1 << 40 ; // ok ``` 因為 C++ 內建的整數視作 int,所以計算 `1 << 40` 時會 overflow 然後如果還是有問題,那就找哪一個變數變成負數,因為 overflow 後會變負數 ### 浮點數的 rounding error 因為電腦本身就是用二進制儲存數字,所以遇到某些小數會出現錯誤 比如 $0.3$ 在程式碼當中可能是 $0.3000000001$ 之類的 反正只要有用到小數的部分就要小心,基本上在浮點數的世界 判斷兩者是否相等應該用 "兩者相減的絕對值是否小於一定數值" 而不是 "==" ### 判斷式的順序問題 在某些情況下,我們會同時使用兩個以上的判斷式,由於判斷式有截斷機制 比如 `while (i < 4 && a[i] >= 0)` 只要在 `i >= 4` 的情況下 while 就會馬上終止,不會判斷到 `a[i] >= 0` 如果我要跑過一個大小為 $4$ 的陣列,判斷有幾個元素為正 ```cpp= ans = 0 ; // for-loop for (int i=0;i<4;i++) if (a[i] > 0) ans++ ; // while-loop i = 0 ; ans = 0 ; while (i < 4 && a[i] > 0) ans++ ; // wrong while-loop i = 0, ans = 0 ; while (a[i] > 0 && i < 4) ans++ ; ``` 可以看到只是順序調換,程式碼就會出現錯誤,因為 `i = 4` 會出現 index error 之後可能還有除法(除以 $0$) 之類的錯誤,請各位在自己留意 ### 編譯器優化 對於某些重複使用、無效運用等等的程式部分,編譯器可能會幫使用者優化 但是對於新手來說,那些部分可能是致命的錯誤,因為在考場上的編譯器優化 肯定比你在平時使用的少很多,所以不一定要完全正確,但要知道如何正確偷懶 ```cpp= for (int i=0;i<strlen(s);i++) if (s[i] == 't') cnt++ ; cout << cnt << '\n' ; n = strlen(s) ; for (int i=0;i<strlen(s);i++) if (s[i] == 't') cnt++ ; cout << cnt << '\n' ; ``` 比如以上例子,第一個寫法跟第二個寫法在編譯器優化後差不多 但是如果缺少編譯器優化,第一個寫法的時間複雜度為 $O(n^2)$ 第二個為 $O(n)$ 這樣很明顯的差距就是提醒各位千萬不要過度偷懶導致時間或空間爆開 ## python ### 變數 type 由於 python 的變數可以不斷切換 type,所以在使用時須要特別小心 ### 浮點數的 rounding error 因為電腦本身就是用二進制儲存數字,所以遇到某些小數會出現錯誤 比如 $0.3$ 在程式碼當中可能是 $0.3000000001$ 之類的 反正只要有用到小數的部分就要小心,基本上在浮點數的世界 判斷兩者是否相等應該用 "兩者相減的絕對值是否小於一定數值" 而不是 "==" ### 判斷式的順序問題 在某些情況下,我們會同時使用兩個以上的判斷式,由於判斷式有截斷機制 比如 `while (i < 4 && a[i] >= 0)` 只要在 `i >= 4` 的情況下 while 就會馬上終止,不會判斷到 `a[i] >= 0` 如果我要跑過一個大小為 $4$ 的陣列,判斷有幾個元素為正 ```python= ans = 0 # for-loop for i in range(0, 4) : if (a[i] > 0) : ans += 1 # while-loop i = 0 ans = 0 while (i < 4 and a[i] > 0) ans += 1 # wrong while-loop i = 0 ans = 0 while (a[i] > 0 and i < 4) ans += 1 ``` 可以看到只是順序調換,程式碼就會出現錯誤,因為 `i = 4` 會出現 index error 之後可能還有除法(除以 $0$) 之類的錯誤,請各位在自己留意