本篇文章主要寫的內容是一些常用數據類型書寫過程中的注意事項:
1.避免使用“神祕數值”:神祕數值是指那些在程序中出現的且沒有解釋過的數值文字量。最好用具名常量來代表這些神祕值
2.預防除零的錯誤
3.使類型強制轉換變得明顯
4.避免混合類型的比較:如整數和浮點數比較,如果程序能夠運行起來也是歪打正着,所以不要這麼使用
5.注意編譯器的警告
整數
使用整數時,需要注意一下問題:
1.檢查整數除法:在數學領域中的除法運算10*(7/10)=(10*7)/10=7,但是在編程中卻不相等10*(7/10)=0,因爲7/10轉換成整數時爲0,所以在整數除法過程中要嚴格檢查一下除法運算的順序。
2.檢查整數溢出:在做整數的加法或乘法的時候,要留心可能的最大整數進行運算的問題。
3.檢查中間結果溢出的問題。
浮點數
使用浮點數時主要考慮的是,很多十進制小數不能夠精確地用數字計算機中的1和0表示。
1.避免數量級相差巨大的數之間的加減運算,如32爲浮點數,1 000 000.00 + 0.1 可能會得到1 000 000.00,因爲32位不能提供足夠的有效位數包容1 000 000 和0.1之間的數值區間。解決方案就是,從最小數值開始相加。
2.避免等量判斷:很多應該想等等額浮點數值並不一定相等。如10個0.1相加來很少會等於1.0。
3.處理舍入誤差問題:由於舍入誤差導致的錯誤與數字之間數量級相差太大導致的錯誤是一樣的。
4.檢查語言和庫函數對特定數據類型的支持
字符和字符處
1.避免使用神祕字符和神祕字符串:神祕字符和神祕字符串的概念與神祕數值相似,就是毫無解釋的一些字符和字符串,通常應該使用具名常量來代替這些隨意寫出來的神祕字符和字符串。
2.避免off-by-one錯誤(出現在字符處的結尾處’\0‘):由於字符串的下表索引方式幾乎與數組相同,因此要避免因爲讀寫操作超過了字符串末尾而導致的off-by-one錯誤。
3.瞭解語言和開發環境是如何支持Unicode的
4.在程序生命週期中儘早解決國際化/本地化策略
5.如果知道只需要支持一種文字的語言,請考慮使用ISO8859字符集
6.如果需要支持多種語言,請使用Unicode
7.採用某一致的字符串類型轉換策略
針對C語言中的字符串中的一些問題:
C++中的STL庫中的string類已經消除了大多數C中字符串相關的傳統問題:
1.注意字符串指針和字符數組之間的差異,與字符串指針和字符數組相關的問題來源於C處理字符串的方式:警惕任何包含字符串和等號的表達式;通過命名規則區分變量是字符數組還是字符串指針。
2.把C-style字符串的長度聲明爲CONSTANT+1的方式
3.用null初始化字符串以避免無結束符的字符串,C語言通過查找空字符來認定字符串有沒有結束,因此一定要將其最後一位賦值成空或’\0‘
4.用字符數組取代C中的指針
5.用strncpy()取代strcpy()以避免無結束符的字符串
布爾變量
1.用布爾變量對陳旭加以文檔說明
2.用布爾變量來簡化複雜的判斷
3.如果需要的話,創建自己的布爾類型
枚舉類型
1.用枚舉類型來提高可讀性:每當看到字面形式數字的時候,就該考慮一下是否把它換成枚舉類型是不是更加合理。
2.用枚舉類型來提高可靠性
3.用枚舉類型來簡化修改:如果分別用1,2,3來表示不同的含義,當需要修改的時候工作量會很大,因此採用枚舉的方法來將特定的數值表示稱相應的名稱。
4.將枚舉類型作爲布爾變量的替換方案
5.檢查非法數值:用枚舉來標記有哪些是非法的
6.定義出枚舉的第一項和最後一項,以便用於循環邊界
7.把枚舉類型的第一個元素留作非法值
8.明確定義項目代碼編寫標準中第一個和最後一個元素使用規則,並且在使用時保持一致
9.警惕給枚舉元素明確賦值而帶來的失誤
具名常量
具名變量很像變量,一旦賦值以後就不能再修改了,具名常量允許讓你擁有一個名字而不是數字來表示固定的量。當需要修改時只需要修改一次即可。
1.在數據聲明中使用具名常量
2.統一地使用具名常量:如果需要表示的是同一個實體,在一處使用具名常量,而在另一處使用數字符號是非常危險的。
3.避免使用文字量,即使是“安全”的
數組
1.確認所有的數組下標都沒有超出數組的邊界
2.考慮用容器來取代數組,或者將數組作爲順序化結構來處理
3.檢查數組的邊界
4.如果數組是多維的,確認下標的使用順序是正確的
5.提防下標串話:即多層循環嵌套的時候最容易發生裏面的循環引錯了其他的數組或者下標的情況。
創建自己的類型(類型別名)
這樣的好處與具名常量的好處是一樣的,如吧x、y、z座標系中的座標值轉化爲緯度、經度和海拔高度,此時不知道是使用單精度還是雙精度的時候,可以利用typedef來定義一個名稱如 typedef float coordinate;作爲一個浮點數的代表,當需要修改爲雙精度的時候就可以修改一處就可以了。
創建自定義數據類型的指導原則
1.給所創建的類型取功能導向的名字:避免使用那些代表了類型底層計算機數據類的類型名。
2.避免使用預定義類型:如果類型有可能變化,就應避免在除typedef或類型定義以外的任何位置使用預定義的類型。
3.不要重定義一個預定義的類型
4.定義替代類型以便於移植
5.考慮創建一個類而不是使用typedef:簡單的typedef對隱藏變量的底層類型信息室大有幫助的。然而,可能會需要定義類所能獲得的哪些二外的靈活度和控制力。