学习C ,常见的误解
學習C 你是否會有以下幾點誤解?
1. “要理解C ,你必須先學習C”
?
2. “C 是一門面向對象的語言”
?
3. “為了軟件可靠性,你需要垃圾回收”
?
4. “為了效率,你必須編寫底層代碼”
?
5. “C 只適用于大型、復雜的程序”
?
如果你中*了,說明這篇文章適合你看。對某些人,某些任務,在某些時間,其中一些誤解曾經只是正確的。然而,在如今的C ,應用廣泛使用的最先進的ISO C 2011編譯器和工具,它們只是誤解。
?
下面來一一解釋
?
誤解一:“要理解C ,你必須先學習C”
?
學習C 基礎編程比學習C要容易地多。
?
C幾乎是C 的一個子集,但是它不是最先要學習的最好的子集,因為C缺少計數支持,類型安全,和易用的標準庫,而C 為簡單任務提供了這些。
?
誤解二:“C 是一門面向對象的語言”
?
C 支持OOP和其他編程風格,但它并不局限于狹隘的“面向對象”。它綜合地支持了包括面向對象和泛型編程技術。通常,一個問題的最優解決方案,包含不止一種風格(范例)。“最優”,我指的是最短、最易于理解、最有效率和最易于維護等。
?
“C 是一門面向對象的語言”使人們認為C 不是必要的(當與C做比較時),除非你需要一個巨大的類繼承層次以及很多須函數(運行時多態)——對很多人和很多問題,這樣應用并不合適。相信這個誤區導致C 因為不是純面向對象而遭到譴責;畢竟,如果你把“好”和“面向對象”等同起來,那么C 明顯包含了很多不是面向對象的東西,一定會被認為是“不好”。不管是哪種情形,這個誤解為不學習C 提供了一個很好的借口
?
誤解三:“為了軟件可靠性,你需要垃圾回收”
?
在回收不再使用的內存上,垃圾回收做的很好,但是并不完美。它并非靈丹妙藥。因為內存可以被間接地引用,并且很多資源并不是普通內存。
?
誤解四:“為了效率,你必須編寫底層代碼”
?
許多人相信高效率的代碼必須是底層代碼。一些人甚至認為底層代碼天生就是高效的(“如果代碼很丑陋,那它一定很高效!一定有人花費了大量時間和精力來優化它!”)。當然,你僅僅使用底層代碼是可以寫出高效代碼的,并且有時在直接處理機器資源時必須使用底層代碼。
?
然而,你一定要衡量一下工作是否有價值:現代C 編譯器非常高效,而現代機器架構非常復雜。如果必須使用底層代碼,一定要通過接口封裝起來,以便于使用。通常,通過高層接口封裝底層代碼,會帶來更好的優化(如,避免“濫用”底層代碼)。在關注效率的場合,首先嘗試用高層抽象來呈現需要的解決方案,而不要不加考慮地使用比特位和指針。
?
誤解五:“C 只適用于大型、復雜的程序”
?
C 是一個巨型的語言。它定義的大小和C#與Java差不多。但是這并不意味著你必須知道每一個細節,或者在每一個程序中都用到所有特性。
?
接下來再說一個C 非常經典的易犯錯的案例
?
錯誤代碼:
?
12bool operator( )(const GUID& _Key1, const GUID& _Key2) const{ return memcmp(&_Key1, &_Key2, sizeof(GUID)) == -1; }解釋
?
不能將 memcpy()、strcmp() 以及其他一些標準函數的返回值,和 1、-1 這些具體的數字做比較,因為這些函數的返回值只保證大于 0 或者小于 0(譯注:而并不保證大于0就等于1,小于0就等于-1)。
?
上面那段錯誤的代碼可能在很長時間內都能正常工作。不過那僅僅是因為運氣好而已,沒什么其他原因。某一天你寫的函數很可能突然間就崩潰了 —— 比如,你換了一個編譯器編譯源代碼,或者通過其他方式優化了 memcpy() 函數。然后你的代碼就不能正常工作了。
?
正確的代碼:
?
12bool operator( )(const GUID& _Key1, const GUID& _Key2) const{ return memcmp(&_Key1, &_Key2, sizeof(GUID)) < 0; }?
建議
?
不要依賴函數本身的行為。如果文檔上說一個函數能返回一個不等于 0 的值,那它就是這么實現的。也就是說這個函數可能返回 -10、2 或者 1024。你可能經常看到函數的返回值就是 -1、0 或者 1,但是這并不能保證它每次都會這么做。
?
這個錯誤是通過 PSV-Studio 靜態分析工具掃描分析得到的。錯誤文本如下:V698 表達式 “memcmp(…) == -1“ 是不正確的。這個函數可能的返回值不一定只有“-1”,而可能是任何負數。請考慮到使用 “memcmp(…) < 0 ”來替換。
聲明:
本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
總結
以上是生活随笔為你收集整理的学习C ,常见的误解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十大智能家居公司排名(最受欢迎的十大智能
- 下一篇: C语言的标识符由什么组成