日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习C ,常见的误解

發布時間:2023/12/2 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习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 ,常见的误解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。