鍍金池/ 教程/ C/ 導(dǎo)言:C的笛卡爾之夢
練習(xí)9:數(shù)組和字符串
練習(xí)6:變量類型
練習(xí)3:格式化輸出
練習(xí)4:Valgrind 介紹
練習(xí)28:Makefile 進(jìn)階
練習(xí)14:編寫并使用函數(shù)
練習(xí)21:高級數(shù)據(jù)類型和控制結(jié)構(gòu)
練習(xí)20:Zed的強(qiáng)大的調(diào)試宏
練習(xí)18:函數(shù)指針
練習(xí)0:準(zhǔn)備
練習(xí)15:指針,可怕的指針
練習(xí)27:創(chuàng)造性和防御性編程
練習(xí)22:棧、作用域和全局
練習(xí)10:字符串?dāng)?shù)組和循環(huán)
練習(xí)8:大小和數(shù)組
練習(xí)16:結(jié)構(gòu)體和指向它們的指針
練習(xí)7:更多變量和一些算術(shù)
練習(xí)23:認(rèn)識達(dá)夫設(shè)備
練習(xí)12:If,Else If,Else
練習(xí)2:用Make來代替Python
練習(xí)1:啟用編譯器
練習(xí)11:While循環(huán)和布爾表達(dá)式
練習(xí)5:一個C程序的結(jié)構(gòu)
練習(xí)24:輸入輸出和文件
練習(xí)25:變參函數(shù)
練習(xí)13:Switch語句
練習(xí)19:一個簡單的對象系統(tǒng)
練習(xí)26:編寫第一個真正的程序
導(dǎo)言:C的笛卡爾之夢
練習(xí)17:堆和棧的內(nèi)存分配

導(dǎo)言:C的笛卡爾之夢

Whatever I have up till now accepted as most true and assured I have gotten either from the senses or through the senses. But from time to time I have found that the senses deceive, and it is prudent never to trust completely those who have deceived us even once.

勒內(nèi)·笛卡爾,《第一哲學(xué)沉思錄》

如果有一段引述用來描述C語言編程的話,那就是它了。對于大多數(shù)程序員,C是極其可怕而且邪惡的。他就像是惡魔、撒旦,或者一個使用指針的花言巧語和對機(jī)器的直接訪問來破壞你生產(chǎn)力的騙子洛基。于是,一旦這位計算界的路西法將你纏住,他就會使用邪惡的“段錯誤”來毀掉你的世界,并且揭露出與你交易中的騙局而嘲笑你。

然而,C并不應(yīng)由于這些現(xiàn)實而受到責(zé)備。你的電腦和控制它的操作系統(tǒng)才是真正的騙子,而不是朋友。它們通過密謀來向你隱藏它們的真實執(zhí)行邏輯,使你永遠(yuǎn)都不真正知道背后發(fā)生了什么。C編程語言的失敗之處只是向你提供接觸背后真正工作原理的途徑,并且告訴了你一些難以接受的事實。C會向你展示痛苦的真像(紅色藥丸),它將幕布拉開來向你展示一些神奇的原理。C即是真理。

既然C如此危險,為什么還要使用它?因為C給了你力量來穿越抽象的假象,并且將你從愚昧中解放出來。

你會學(xué)到什么

這本書的目的是讓你足夠熟悉C語言,并能夠使用它編寫自己的軟件,或者修改其他人的代碼。這本書的最后,我們會從一本叫做“K&R C”的名著中選取實際的代碼,并且用你學(xué)過的知識來做代碼審查。你需要學(xué)習(xí)下面這些東西來達(dá)到這一階段:

  • C的基本語法和編寫習(xí)慣。
  • 編譯,make文件和鏈接。
  • 尋找和預(yù)防bug。
  • 防御性編程實踐。
  • 使C的代碼崩潰。
  • 編寫基本的Unix系統(tǒng)軟件。

截至最后一章,你將會有足夠的工具來解決基本的系統(tǒng)軟件、庫和其它小項目。

如何閱讀本書

這本書為那些已經(jīng)掌握至少一門編程語言的人而設(shè)計。如果你還沒有接觸過編程,我推薦你先學(xué)習(xí)笨辦法學(xué)Python,這本書適用于真正的新手并且適合作為第一本編程書。一旦你學(xué)會了Python,你可以返回來開始學(xué)習(xí)這本書。

對于那些已經(jīng)學(xué)會編程的人,這本書的開頭可能有些奇怪。它不像其它書一樣,那些書中你會閱讀一段段的文字然后編寫一些代碼。相反,這本書中我會讓你立即開始編程,之后我會解釋你做了什么。這樣更有效果,因為你已經(jīng)經(jīng)歷過的事情解釋起來更加容易。

由于采用了這樣的結(jié)構(gòu),下面是本書中你必須遵守的規(guī)則:

  • 手動輸入所有代碼。不要復(fù)制粘貼!
  • 正確地輸入所有代碼,也包括注釋。
  • 運(yùn)行代碼并保證產(chǎn)生相同的輸出。
  • 如果出現(xiàn)了bug則修正它。
  • 做附加題時,如果你做不出某道題,馬上跳過。
  • 在尋求幫助之前首先試著自己弄懂。

如果你遵守了這些規(guī)則,完成了本書的每一件事,并且還不會編程C代碼的話,你至少嘗試過了。它并不適用于每個人,但是嘗試的過程會讓你成為一個更好的程序員。

核心能力

我假設(shè)你來自于一種弱者的語言。這些“易用的”語言之一是Python或者Ruby,它們帶給了你草率的思維和半吊子的黑魔法?;蛘撸憧赡苁褂妙愃芁isp的語言,它假設(shè)計算機(jī)是純函數(shù)式的奇幻大陸,帶有一些為嬰兒準(zhǔn)備的充氣墻。再或者你可能學(xué)過Prolog,于是你認(rèn)為整個世界都是一個數(shù)據(jù)庫,你可以從中尋找線索。甚至更糟糕的是,我假設(shè)你一直都在用IDE,所以你的大腦布滿了內(nèi)存漏洞,并且你每打三個字符都要按CTRL+空格來打出函數(shù)的整個名字。

無論你的背景如何,你都可能不擅長下面四個技能:

閱讀和編寫

如果你使用IDE這會尤其正確。但是總體上我發(fā)現(xiàn)程序員做了很多“略讀”,并且在理解上存在問題。它們會略讀需要詳細(xì)理解的代碼,并且覺得他們已經(jīng)理解了但事實上沒有。其它語言提供了可以讓他們避免實際編寫任何代碼的工具,所以面對一種類似C的語言時,他們就玩完了。你需要知道每個人都有這個問題,并且你可以通過強(qiáng)迫自己慢下來并且仔細(xì)對待閱讀和編寫代碼來改正它。一開始你可能感到痛苦和無聊,但是這樣的次數(shù)多了它也就變得容易了。

專注細(xì)節(jié)

每個人都不擅長這方面,它也是劣質(zhì)軟件的罪魁禍?zhǔn)?。其它語言讓你不會集中注意力,但是C要求你集中全部注意力,因為它直接在機(jī)器上運(yùn)行,并且機(jī)器比較挑剔。C中沒有“相似的類型”或者“足夠接近”,所以你需要注意,再三檢查你的代碼,并假設(shè)你寫的任何代碼都是錯的,直到你能證明它是對的。

定位差異

其它語言程序員的一個關(guān)鍵問題就是他們的大腦被訓(xùn)練來指出那個語言的差異,而不是C。當(dāng)你對比你的代碼和我練習(xí)中的代碼時,你的眼睛會跳過你認(rèn)為不重要或者不熟悉的字符。我會給你一些策略來強(qiáng)制你觀察你的錯誤,但是要記住如果你的代碼并不完全像書中的代碼,它就是錯的。

規(guī)劃和調(diào)試

我喜歡其它較簡單的語言,因為我可以想怎么寫就怎么寫。我將已有的想法輸入進(jìn)解釋器,然后可以立即看到結(jié)果。你可以把你的想法試驗出來,但是要注意,如果你仍然打算“試驗代碼使其能夠工作”,它就行不通了。C對于你來說稍困難,因為你需要規(guī)劃好首先創(chuàng)建什么。的確,你也可以進(jìn)行試驗,但是比起其他語言,你必須在C中更早地嚴(yán)肅對待代碼。我會教給你在編程之前規(guī)劃程序核心部分的方法,這對于使你成為更好的程序員十分有幫助。即使一個很小的規(guī)劃,都會使接下來的事情變得順利。

學(xué)習(xí)C語言會使你變成更好的程序員,因為會強(qiáng)制你更早、更頻繁地解決這些問題。你不會再草率地編寫半吊子的代碼,代碼也會能夠正常工作。C的優(yōu)勢是,它是一個簡單的語言,你可以自己來弄清楚,這使得它成為用于學(xué)習(xí)機(jī)器,以及提升程序員核心技能的最佳語言。

C比其它語言都要難,而這是由于C并不對你隱藏細(xì)節(jié),它們在其它語言中都試圖并且未能被掩蓋。

協(xié)議

原書在完稿之后可以自由分發(fā),并且能在亞馬遜上購買。該中譯版本遵循CC BY-NC-SA 4.0協(xié)議,你可以在保留署名和出處的前提下以非商業(yè)目的自由轉(zhuǎn)載。