C 的學習思路(總結以備忘)

2021-10-04 14:07:33 字數 4432 閱讀 4028

本文在creative commons許可證下發布

學習c++:實踐者的方法

看到標題就已經知道,如何學習c++這個問題的答案其實已經很明顯了。我們所欠缺的是乙個書單。

第一本

第三本(是的,第三本)

另一方面,c++不同於c的乙個關鍵地方就在於,c++在完全保留有c的高效的基礎上,增添了抽象機制。而所謂的「現代c++風格」便是倡導正確利用c++的抽象機制和這些機制構建出來的現代c++庫(以stl為代表)的,bjarne也很早就倡導將c++當作一門不同於c的新語言來學習(就拿記憶體管理來說,使用現代c++的記憶體管理技術,幾乎可以完全避免new和delete),因此,一本從這個思路來介紹c++的入門書籍是非常必要的——這就是推薦《accelerated c++》的原因(以下簡稱ac++)。《accelerated c++》的作者andrew koenig是c++標準化過程中的核心人物之一。

第二本

c++是在c語言大行其道的歷史背景下發展起來的,在一開始以及後來的相當長一段時間內,c++是c的超集,所有c的特性在c++裡面都有,因此導致了大量後來的c++入門書籍都從c講起,實際上,這是乙個誤導,因為c++雖然是c的超集,然而用抽象機制擴充套件c語言的重大意義就在於用抽象去覆蓋c當中裸露的種種語言特性,讓程式設計師能夠在乙個更自然的抽象層面上程式設計,比如你不是用int*加乙個陣列大小n來表示乙個陣列,而是用可自動增長的vector;比如你不是用malloc/free,而是用智慧型指標和raii技術來管理資源;比如你不是用乙個只包含資料的結構體加上一組函式來做乙個暴露的類,而是使用真正的adt。比如你不是使用second-class的返回值來表達錯誤,而是利用first-class的語言級異常機制等等。然而,c畢竟是c++的源頭,剝開c++的抽象外衣,底層仍然還是c;而且,更關鍵的是,在實際編碼當中,有時候還的確要「c」一把,比如在模組級的二進位制介面封裝上。bjarne也說過,oo/gp這些抽象機制只有用在合適的地方才是合適的。當人們手頭有的是錘子的時候,很容易把所有的目標都當成釘子,有時候c的確能夠提供簡潔高效的解決方案,比如c標準庫裡面的printf和fopen(此例受雲風的啟發)的使用介面就是典型的例子。簡而言之,理解c語言的精神不僅有助於更好地理解c++,更理性地使用c++,而且也有其實踐意義——這就是推薦《the c programming language》(以下簡稱tcpl)的原因。此外,建議在閱讀《accelerated c++》之前先閱讀《the c programming language》。因為,一,《the c programming language》非常薄。二,如果你帶著比較的眼光去看問題,看完《the c programming language》再看《accelerated c++》,你便會更深刻的理解c++語言引入抽象機制的意義和實際作用。

第四本

《accelerated c++》固然寫得非常漂亮,但正如所有漂亮的入門書一樣,它的優點和弱點都在於它的輕薄短小。短短3百頁,對現代c++的運用精神作了極好的概述。然而要熟練運用c++,我們還需要更多的講解,這個時候一本全面但又不鑽語言牛角尖,從「語言是如何支援抽象設計」的角度而不是「為了講語言特性而講語言特性」的角度來介紹一門語言的書便至關重要,在c++裡面,我還沒有見到比c++之父本人的《the c++ programming language》(以下簡稱tc++pl)做得更好的,c++之父本人既有大規模c++運用的經驗又有語言設計思想的最本質把握,因此tc++pl才能做到高屋建瓴,不為細節所累;同時又能做到實踐導向,不落於為介紹語言而介紹語言的巢臼。最後有乙個需要提醒的地方,tc++pl其實沒有它看起來那麼厚,因為真正介紹語言的內容只有區區500頁(第一部分:基礎;第二部分:抽象機制;以及第四部分:用c++設計),剩下的是介紹標準庫的,可以當作manual(參考手冊)。

建議3

是的,在c++方面登堂入室並不需要閱讀多得恐怖的所謂「經典」,至於為什麼這些「經典」無需閱讀,前面已經講的很詳細了。其實你只需要這四本書,就可以奠定乙個深厚的基礎,以及對c++的成熟理性的現代運用理念。其餘的書都可以當成參考資料,用到的時候再去翻閱,即:

建議4:實踐驅動地學習。

實踐驅動當然不代表什麼基礎都不打,直接捋起袖管就上。不管運用哪種工具,首先都需要知道關於它的一定程度的基本知識(包括應該怎麼用,和不應該怎麼用)。知道應該怎麼用可以幫你發揮出它的正確和最大效用,知道不應該怎麼用則可以幫你避免用的過程中傷及自身的危險。這就是為什麼我建議你看四本書,以及建議你要了解c++中的陷阱(大部分來自c,因此你可以閱讀《c缺陷和陷阱》)的原因。

實踐驅動代表著一旦乙個紮實的基礎具備了之後獲得延伸知識的方式。出於環境和心理的原因,c++學習者們在這條路上走錯的機率非常大,許多人乃至以上來就拿effective c++&more effective c++、inside c++ object model這類書去讀(是的,我也是,所以我才會在這裡寫下這篇文章),結果讀了一本又一本,出現知道虛函式實現機制的每個細節卻不知道虛函式作用的情況。

實踐驅動其實很簡單:實踐+查文件。知識便在這樣乙個簡單的迴圈中積累起來。實踐驅動的最大好處就是你學到的都是實踐當中真正需要的,屬於那「80%」最有用的。而查文件的重要性前面已經說過了,但對於c++實踐者來說,哪些「文件」是非常重要的呢?

第二本

《c++ coding standard》。無需多作介紹,這是一本濃縮了c++社群多年來寶貴的經驗結晶的書,貼近實踐,處處以80%場景為主導,不鑽語言旮旯,用本為主…總之,非常值得放在手邊時時參閱。因為書很薄,所以也不妨先往腦袋裡面裝一遍。書中的101條建議的介紹都很簡略,並且指出了詳細介紹的延伸閱讀,在延伸閱讀的時候還是要注意不要陷入無關的細節和不必要的技巧中,時時抬頭看一看你需要解決的問題。在c++編碼標準方面,bjarne也有一些建議。

第一本

《the pragmatic programmer》,程式設計師的傑作;雖然不是一本c++的書,但其介紹的實踐理念卻是所有程式設計師都需要的。

第三本

《code complete, 2nd edition》,這是一本非常卓越的參考資料,涉及開發過程的全景,有大量寶貴的經驗。你未必要一口氣讀完,但你至少應該知道它裡面都寫了哪些內容,以便可以回頭參閱。

其它

所有優秀的技術書籍都是資料**。一旦養成了查文件的習慣,所有的電子書、紙書、網路上的資源實際上都是你的財富。不過,查文件的前提是你要從手邊的問題分析出應該到什麼地方去查資料,這裡,分析問題的能力很重要,因此:

建議5:思考。

這個建議就把我們帶到了第四本書:

第四本:

《你的燈亮著嗎?》。不作介紹,自己閱讀,這本書只有一百多頁,但精彩非常,妙趣橫生。

最後,要想理性地運用一門語言,不僅需要看到這門語言的特點,還要能夠從另乙個角度去看這門語言——即看到它的缺點,因為從心理上——

事實10:一旦我們熟悉了一門語言之後,就容易不知不覺地在其框架下思考,受到語言特性的細節的影響,作出second-class的設計。

對於像c++這樣的在抽象機制上作了折衷的語言,尤其如此,思考容易受到語言機制本身細節的影響,往往在心裡頭還沒想好怎麼抽象,就已經確定了使用什麼語言機制乃至技巧;更有甚者是為了使用某個特性而去使用某個特性。然而,實際上,我們應該——

建議6:脫離語言思考,使用語言實現。

關於設計的一般理念,eric raymond在《the art of unix programming》的第二部分有非常精彩的闡述。

此外,除了脫離語言的具體抽象機制來思考設計之外,學習其它語言對同類抽象機制的支援也是非常有益的,正如老話所說,「兼聽則明」。前一陣子reddit上也常出現「how learning *** help me become a better yyy programmer」(其中***和yyy指代程式語言)的帖子,正是這個道理,這就把我們帶到了最後乙個建議:學習其它語言。

建議7:學習其它語言。

如果你是乙個系統程式設計師,你可能會覺得沒有必要學習其它語言,然而未必如此,你未必需要精通其它語言,而是可以去試著了解其它語言的設計理念,是如何支援日常程式設計中的設計的。這一招非常有利於在使用你自己的語言程式設計時心理上脫離語言機制細節的影響,作出更好的抽象設計。

尾聲

C語言課程學習思路及學習總結

學習c程式這門課一年了,這是我們學的第一門專業課。在大學裡,c語言不但是計算機專業的必修課程而且也是非計算機專業學習計算機基礎的一門必修課程。所以作為我這個計算機專業的學生來說當然十分重要老師在第一節課說過,c語言是計算機的基礎,大多數軟體都需要用c語言來編寫,同時,我覺得c語言應該是操作和理論相結...

mysql學習思路總結

相信大家已經讀了筆者三篇單機儲存到mysql的思考 有什麼感悟呢,希望大家發表一下,共同學習提高 總結一下三篇思考 筆者只是想引導大家學習導致表觀現象的內部原理 mysql底層 儲存結構 索引優化 mysql併發事務樂觀鎖悲觀鎖 隔離性 sql語句在不同隔離級別下執行的差異 當前讀和快照讀的差異 m...

關於C 的學習思路

建議根據學習的深度按照如下順序 c 語言程式設計 錢能 清華大學出版社 譚浩強 c 程式設計 thinking in c c primerthe c programming languageeffective c more effective c exceptional c more excepti...