1. 程式人生 > >笨方法學習C中文

笨方法學習C中文

序言

這是一份正在編寫中的《learn c the hard way》這本書的粗糙複製,語法可能會很糟糕,也可能會有部分的缺失,但是你可以瞭解我是如何編寫這本書的。

這個列表是一個用來討論本書和問問題的列表,並不是一個宣告列表。

最後,如果你還不會使用Python的話,可以閱讀我所編寫的《Learn Python The Hard Way》,這本書不是面向初學者的,而是面向至少已學過一門語言的人。

簡介:關於C的夢想

無論是什麼我現在接受的覺得最真實,要保證我已從感官或通過感官得到。但有時我>發現感官是不真實的,這使我不會完全去相信曾經欺騙過我一次的人。 —Rene Descartes, Meditations On First Philosophy

If there ever were a quote that described programming with C, it would be this. To many programmers, this makes C scary and evil. It is the Devil, Satan, the trickster Loki come to destroy your productivity with his seductive talk of pointers and direct access to the machine. Then, once this computational Lucifer has you hooked, he destroys your world with the evil "segfault" and laughs as he reveals the trickery in your bargain with him.

但是C不應該為其揹負罪名,對你來說,你的電腦和作業系統控制了它,所以它們才是真正的欺騙者。它們向你隱藏了它們在內部做了什麼,這讓你不知道它們真正是如何執行的。c語言唯一的失敗是,它讓你知道內部到底做了什麼,並告訴你關於硬體的事實。C gives you the red pill. C pulls the curtain back to show you the wizard. C is truth.

既然C如此的危險,那我們為什麼要用它呢? 因為C讓你可以控制虛假的抽象和從愚昧中解放出來。

你將會學習什麼?

這本書的目的是讓你能更好的掌控C語言並用C編寫你自己的軟體,或是修改他人的程式碼。最後我們會從一本更著名的書《K&R C and code》中抽取一些程式碼來回顧你所學的知識。為了能夠看懂這些程式碼你需要做下面的這些事:

  • C的基本語法和語義
  • 瞭解編譯器,makefiles檔案,連結器
  • 查詢bug並修正
  • 防禦性程式設計練習
  • 深入理解C程式碼
  • 編寫基本的Unix系統軟體

到最後一章,你將會有足夠的知識去解決基本的系統軟體,庫以及其它的小工程。

如何閱讀本書?

這本書是針對至少已經學習過一門程式語言的讀者,如果你還沒有學習過任何一門程式語言,那麼我建議你先去閱讀《Learn Python The Hard Way》(#).這本書是完全針對初學者的,而且也非常適合作為程式設計的第一本書。當你已經滿足以上條件後,你就可以開始閱讀本書了。

對於已經學習過程式設計的人來時候,一開始可能會覺得本書會有些奇怪。你所閱讀的其它書籍一般會在段落中插入有很多的程式碼,相反的,我讓你在閱讀的過程中進行編碼,然後我會為你解釋你做了什麼。這樣會讓你學得更好,因為這個過程中會比較容易解釋你在學習的過程中所經歷的。

正是由於本書的這種結構,你在閱讀的過程中必須要遵循以下的規則:

  • 自己編寫所有的程式碼,不要去複製貼上。
  • 編寫程式碼一定要完整準確,註釋也一樣。
  • 執行自己編寫的程式碼並保證得到和我一樣的輸出結果。
  • 如果出現bug,修復它。
  • 做本書所給的額外的練習,但如果有無法完成的可以跳過。
  • 在尋求幫助之前儘量自己去解決問題

如果你按照這些規則來閱讀這本書了還是不會用C程式設計,也不要傷心,這說明你至少嘗試過了。這本書並不適合每一個人,但這個嘗試的過程會讓你成為一個更好的程式設計師。

C語言的核心的競爭力

我假設你來自其它一門較弱的語言的陣營,一門有用的語言像Ruby和Python會讓你遠離愚蠢的思想和醜陋的程式設計技法。也許你使用Lisp語言你會感覺電腦就像由一些驚奇的函式填充起來的,如同孩子的填充牆一樣。也許你學過Prolog語言而且你覺得整個世界就像一個數據庫一樣,你在其中尋找線索。更糟糕的是,我敢打賭,你一直在使用整合開發環境(IDE),所以你的大腦裡充滿了記憶體漏洞,而且你你也無法寫入一個函式的名字如果不去敲打CTRL-SPACE 這三個你每天都再用的字元的話。

不管你的知識背景是怎樣的,你可能都會在下面四個方面做得不夠好:

  • 邊閱讀邊編寫

    如果你使用IDE的話,這是相當正確地做法,但是我發現許多的程式設計師通常在閱讀的過程中會省略過多,不能很好的閱讀並理解內容。他們會跳過他們認為已經理解的程式碼,但事實上他們並沒有詳細的瞭解。有的語言會提供有許多的工具讓程式設計師儘量少的去編寫程式碼,這會讓他們在面對像C語言這樣的程式碼時崩潰。面對這種情況最簡單的方法就是告訴自己每個人都會遇到這樣的問題,如果你強迫自己靜下心來不斷的閱讀和編寫的話,你就會克服這些問題。一切的開端都是痛苦和苦惱的,但是不斷的去突破的話,你就會漸漸的發現其實很容易去做的。

  • 注重細節

    每個人在點都做得比較糟糕,這也是糟糕的軟體的最大問題。其它的語言可能會讓你不用去過多的關注細節,但是C會要求你完全的去注意,因為C會深入到機器的內部。對於C來說,沒有“相似”和“近似”的說法,所以你需要充分的去注意。重複的去檢查你的工作,假設你所做的都是錯誤的直到你能證明它們都是正確的為止。

  • 發現不同

    從其它語言陣營的人(不是C)會有一個關鍵的問題就是它們的大腦會不自覺的去尋找語言間的差異。當你將你寫的程式碼和我練習中的程式碼進行比較時,你的眼睛會跳過你覺得沒有意義或是你不熟悉的部分。我之前已經告訴你策略就是強迫你去發現你的錯誤,時刻注意你的程式碼是否和本書中的程式碼一致。

  • 計劃和除錯

    我喜歡其它的一些簡單的語言是因為我可以將其掛起來。我可以將我的想法敲在它們的翻譯器中並能夠立馬得到結果。這對於探索我們的想法很有用,但是你是否發現如果你一致去做“探索並得到結果”的過程最終是沒有意義的。C比較困難是因為它要求你想要建立什麼之前你首先需要制定計劃。當然,你也可以先編寫一部分,但是與其它語言相比,C語言會更早的讓你陷入困境中。我會叫你在開始編碼之前先將程式的重要部分計劃出來,而且這也會讓你更有可能成為一個更好的程式設計師。即使是一些小小的計劃也會讓事情變得更簡單。

學習C語言會讓你成為一個更好的程式設計師,因為這會迫使你更早的和更頻繁的去處理以上的那些問題。你不能讓你愚昧和你編寫的程式醜陋。C語言的優勢是,它是一門簡單的語言,這使你可以靠你自己來學習,同時也是一門能讓你更好的瞭解電腦和對核心技能掌握得更好。

C語言會比其它的一些語言難是因為它對你沒有任何的隱藏,而其它的語言向盡力的隱藏細節或是無法做到完全的透明。

License

這本書是免費閱讀的,但是直到我完成之前你不能夠發行或是修改它。我需要保證本書的未完成版本出現流出並迷惑使用它的學生的情況。