學C,通常看上一兩本入門書足矣(水貨如我,就看過一本譚浩強),而書之好壞無所謂,怎么都能把你整入門了,而你一入門,便不太可能再去讀一本更好的入門經典。于是我產生了把主流、經典的C入門書籍都擼一遍的念頭,比比看,到底哪(些)本最適合入門——專業蛋疼,請勿模仿——一來彌補自己錯過的好書(學習機會),二來供準備學C的朋友參考(少走彎路)。
不管你學什么,入門書就如啟蒙老師一樣重要,老師不好,你對所學內容都會產生排斥心理,啟蒙好了,這門手藝甚至可能成為你的看家本領。C語言規模并不龐大,但所含知識點比較雜亂,所有教材都這么些內容,就看編者以什么順序、什么主次、什么表達方式講述。私以為一本好的入門書應具備以下兩個特點:一是親和易讀,如同一個故事娓娓道來,你翻開的是一個多彩的世界,而不是一本僵硬的字典;二是分量足夠,看完它你就真正入門了,有些書大白話噼里啪啦扯了半天乍感覺挺有意思其實沒啥內容,當你真正著手使用時才發現還得再看本別的。國內良莠不齊的C教程數不勝數,同名如“C程序設計”“C語言程序設計”“C語言程序設計教程”的都多如牛毛,這些不知名的就不予考慮了,要看就看經典。
→ 如果你是零基礎
《明解C語言》(337頁)推薦指數:★★★★★
乍一看還以為是本新書,但原版在1999年就發行了,引進得實在太晚。屬于比較嚴肅的教材,忠誠于專業術語,并未考慮更通俗的表達方式,并涉及一些算法,適合正兒八經地學C;內容組織很成功(把排序放在結構體部分的做法很神奇),循序漸進,知識點比較淺,并不全面,相對偏僻及細枝末節的內容沒有講述(也不必要拿來讓初學者頭大),沒有冗余,應該靜下心來一字一句地看,一丁點也不容錯過。PS:把C歷史背景放在附錄不失為聰明的做法,畢竟比起發展史什么的,讀者可能更關心如何立馬寫個hello world。
《21天學通C語言》(614頁)推薦指數:★★★★★
槽點一:這書名也忒俗了吧,這類書一般不都是水貨嗎?
解釋:確實擁有這類書名總是要為人所詬病,但你千萬不該因此而錯過此書。這是本來自國外的教程,原名還就是“Sams Teach Yourself C in 21 Days”,然其質量是國內那些名字類似的書所難以相比的。
槽點二:614頁,也忒厚了吧!完全是學霸級初學者專用啊。
解釋:C語言的21天課程其實只占了前431頁,后面是C++、Java、C#等附加課程,不在本次自虐活動范圍之內,故我也沒有看。
本書把C的每一部分都講解得特別細致,附有例子、經驗、注意點、建議等,還詳細地介紹了各種你腦中可能會產生的疑問或在實踐中可能會遇到的問題。有些教材或多或少顯性或隱性地要求讀者能夠舉一反三,而此書不僅介紹了“一”,把“三”也逐一講解了(比如各知識點的組合運用)。沒有死循知識結構安排內容,而是按照讀者慢慢適應的學習過程循序漸進。為確保讀者理解清楚,提前使用時簡要介紹過的知識點會在后續章節重新詳解。
然而跑上來給的例子并不簡單,一股腦兒介紹不少東西,零基礎者看著可能會有點頭大。還存在一些不嚴謹的地方,雖談不上誤導,但可能會引起困惑。除去這些瑕疵,我終究是被它驚艷到了,力薦之。PS:我看的這2012年8月第一次印刷的版本有不少印刷錯誤,希望后續印版會有校正。
《C Primer Plus》(626頁)推薦指數:★★★★★
怎么說呢,看得出這樣的作者才是真正懂C、愛C的人,對各個版本的C標準了如指掌。好比寫文章,沒有才華的人生搬硬套才把事情講清楚,而渾身才氣的人稍微抖一抖,文字就散落成一篇佳作。第一章概覽就把我赤裸裸地驚艷到了,同樣介紹C的歷史及背景,卻不是其他書那樣死板的陳列,語言精煉意賅,不需講的果斷不講,需要講的一語中的,沒有廢話,一氣呵成。恨自己當初學C看的不是這本。
跑上來一股腦介紹的東西很多,很細,初學者可能見了頭大,但你若能耐下性子細細看懂,必會感嘆它講得真棒。行文極其精致、嚴謹,即使初學者可能體會不到這一點;內容詳盡、細致,無愧于書的厚度,常用的不常用的,基礎應用高級應用,大庭廣眾下的犄角旮旯里的應有盡有;全方位多層次實用技巧、注意事項,示例經典,醍醐灌頂,兼具入門書與工具書的氣質。
總體上云巔工作室譯得還算不錯,但你依然會遇到一些拗口的句子,然而畢竟瑕不掩瑜,書的總體質量擺在那里,看引進第六版時能不能譯得更好些。
《啊哈C!思考快你一步》(191頁)推薦指數:★★★★☆
這是唯一一本實體書和電子版我都沒能接觸到的,或許是不夠熱門,網上找不到完整的pdf,連出版前的草稿版《啊哈C語言》也僅公開了一半。若是有朋友能搞到完整的電子版,懇請予我共享一份。我這里看的便是只有一半內容的先行版(以及正式版的幾十頁試讀樣章),還帶著新鮮的錯別字和病句,但版面接近正式版,讀起來也是比較舒適的。
不知道啊哈磊(作者)這哥們是何方神圣,也僅是個有想法的普通人吧,書上是這么介紹的:“曾在中科院玩過單片機。武漢大學歷史上第一位以本科生身份加入MSRA的小伙伴,在機器學習組從事搜索引擎方面的研究。發表國際會議論文一篇(IEEE)。全國青少年信息學奧林匹克金牌教練。”我很喜歡這樣年輕一代人寫的書,用語隨意,帶著顏表情,博文style,沒有套話,沒有代溝,看著很親近。本書號稱是“小學生坐在馬桶上都可以讀懂的‘C語言編程’入門書”,你可能不信,大學生都喊著學C枯燥,小學生那點基礎和智商就甭提了,可本書還真夠小學生看懂,我甚至覺得有些地方還能寫得更萌、更形象些。不過小學生能接受的程度畢竟是有限的,本書定位是如此的低,以至于只介紹了C最淺的那部分知識,更多篇幅用來舉例、增加讀者的編程興趣,簡直太適合零基礎入門了!而啊哈磊自己基于gcc做的啊哈C編譯器也非常適合初學者練習編程,就像他自己說的,是簡潔得不能再簡潔的C語言編程軟件,沒有工程的概念、沒有編譯鏈接的步驟、沒有環境配置,各種沒有,你一打開連代碼框架都已經寫好了,是專為初學者制作的良心產品。
《C程序設計》(第三版378頁、第四版390頁)推薦指數:★★☆☆☆
把“發行逾1100萬冊”的消息印在封面大中央的做法實在太中二了,你就是本指定教材又不是暢銷書,全國高校都用你不破千萬才怪呢!并且,千萬的銷量同時也意味著接受千萬讀者的檢驗,稍欠嚴謹即易被噴。網上有個500多頁的word文檔(百度“《C程序設計》錯誤”即可找到),簡直太蛋疼了,他寫得完別人也看不完啊!本書確實不夠嚴謹+印刷問題層出+許多地方還存在嚴重錯誤,但這份文檔有點吹毛求疵,其中不少說法令人難以茍同,500多頁的規模水分太大。
這本教材,初學者拿來學編程確實較易理解,但對C語言的把握會有一定偏差,慎讀。而我們不妨暫且忽略其中的一些重大問題,重新審視之。作為國內教材中的典范,此書雖然在內容組織上依然中規中矩,但知識點講解十分通俗,由于通俗,稍顯(我是說稍顯)啰嗦。做教材可以,不適合自學,因為你不能確定哪些是次要的。畢竟作為一本國家級教材,該涵括的都得涵括,不僅要領人進門,還得保證讀者達到能考試的程度;擺脫不了應試教育的特點,為了鞏固知識點,時不時會冒出(i++)+(i++)+(i++)和a+=a-=a*=a這樣神奇的式子。如果你喜歡這種style,千萬不要錯過此書,沒錯,我當年就有點喜歡這種style,乃覺這書不錯的原因之一——竟然讓我搞懂了這么復雜混亂的玩意(后來才發現實際編程中根本沒人這么做)!
→ 如已學過一丟丟
《C程序設計語言》(258頁)推薦指數:★★★★★
昵稱K&R(兩位作者姓氏首字母),C語言之父的作品,就好比向別人介紹自己的孩子,不能再精辟,不能再權威,被奉為C語言圣經。在C還沒有統一標準的年代,78年K&R的第一版直接被廣泛接受為C標準,其他號稱是圣經的C語言書用詞未免也太想當然了……
圣經就好比一件標準模板,國內外數不清的C教程都是參照K&R寫的,一如大堆的瀏覽器都使用了IE內核一樣。B5的開本短短258頁,除去供查閱的附錄僅166頁,再除去第8章“Unix系統接口”僅剩148頁,這么少的篇幅將C語言講得清清楚楚,簡直是場華麗的藝術!
此書寫得非常嚴謹,必要之處還提及老版C的情況,可以說學C必看,但并不適合零基礎入門,正如其第1版序中所言:“本書并不是一本有關程序設計的入門性手冊,它要求讀者熟悉基本的程序設計概念,如變量、賦值語句、循環和函數等。”從頭至尾使用的均是書面化的術語,并涉及到逆波蘭、二叉樹、Unix等專業知識,還時常將C與Fortran、Pascal語言進行比較,你若不了解這些看著一定頭痛,因此K&R并不是入門的最佳選擇。
《C語言入門經典》(第4版571頁、第5版584頁)推薦指數:★★★☆☆
一看這霸氣的書名就知道它是部經典,當然這是譯名,(第4版)原名為“Beginning C: From Novice to Professional”,表達多中肯,沒錯,form的是novice,首先你得是個novice,前言中果斷暗示你最好此前接觸過編程這玩意兒。內容是一整塊一整塊講的,力爭全面、深入,沒有輕重緩急,講完講透為止,必要時毫不客氣地使用后面才細講的技術,導致一下子有過量知識點展現在讀者面前。多數章尾有個程序設計的例子,而這些例子對于初學者來說也明顯過于復雜。
最要命的是,(第4版)我已經看得相當粗略,但依然發現了幾處嚴重的錯誤,不是筆誤也不是印刷問題,為排除翻譯出錯的可能,特意比照了英文原版,(同時也排除了C標準版本的因素)確實有錯(下面例舉兩處,尚未學C的朋友請直接跳過)。此外,不少地方講得不夠清楚,我本懷著崇敬之情拜讀,結果最終對其印象并不太好。
錯誤1(第5版修復)
P267關于realloc()函數:顯然,第二個參數的值不應超過以前分配的字節數。否則,新分配的內存將與以前分配的內存區域大小相同。
原版P270:Obviously the value of the second argument should not exceed the number of bytes that was previously allocated. If it is, you will only get a memory area allocated that is equal to the size of the previous memory area.
錯誤2(第5版未修復)
P462關于流:流是外部數據源或數據目的地的抽象表示,所以鍵盤、顯示器上的命令行和文件都是流。……將數據寫入流(即磁盤文件)有兩種方式。
原版P468:A stream is an abstract representation of any external source or destination for data, so the keyboard, the command line on your display, and files on disk are all examples of streams....There are two ways of writing data to a stream that is a disk file.
第5版的改動非常小,將第4版九成內容照搬,就最后增加了一章“Advanced and Speciallized Topics”(高級專用主題),介紹Unicode、線程等,講得也不易理解甚至不知所云。倒是在排版上有所進步,更適于閱讀,如果你硬要來上一本,第5版會更好一些。
《嗨翻C語言》(588頁)推薦指數:★★★★☆
莫被這厚度嚇怕,它的字很大,空白很大,圖片很多……如果把一般的專業書比作word文檔,那么《嗨翻C語言》就是ppt,各種字體,各種插圖(即使多數只意增加趣味而與正式內容關聯不大),你會覺得眼前一亮,比如:
右下那壯漢居然在想(說?):“可我喜歡這一張,上面有小貓咪呢!”諸如此類數不勝數,隨便翻開一頁都能碰到這樣個無厘頭的吐槽或瘋話,惡搞無極限;知識點與劇情飽滿的故事結合在一起,想忘都難;譯者也幽默風趣,做了不少本土化的工作,比如“三位鉆石王老五準備參加今天的‘非誠勿擾’”……總體感覺甚至像一本幼兒園的啟蒙畫冊。(Head First系列都這個無腦樣我會亂說?)
在開講知識點前先引導讀者自己思考,猜猜這些東西是干啥的,甚至時常讓你站在編譯器或者語言設計者的角度思考問題,這些做法很獨特,讓你從一開始就從很本質的層面去接觸C;同時督促讀者動腦,練習題有趣而簡短,提示、答案及講解也非常到位。然而書里充斥著鮮明的老美風格,很high很激情,可以想象美國學生讀了本書極可能做出很實際很創意的東西,而中國的學生讀著可能感覺反而有點混亂。并且它起點不低,相當不低,明確地說,適合學過其他語言(如Python)的人用來學C,后半部分的高級應用更是涉及操作系統和網絡的知識,盡管它也做了簡單介紹,但我相信沒接觸過的朋友一下子還是難以接受的。
《C語言點滴》(302頁)推薦指數:★★★★★
看得出作者確實是個有熱情有想法的好老師,語言輕松幽默有內涵,跑上來1.1節裝備篇大話程序員屌絲著裝就能閃瞎你眼。真正意義上的由淺入深,一開始淺得連水都沒有,然后不知不覺就潛到了馬里亞納海溝。內容并不系統,比起其他的C語言書,它不是教材而是教輔,更多的是總結性的東西(使用技巧注意事項什么的)——作者總結了自己教學過程中常見的問題與經驗,參考了一些經典之作,對其中內容進行了二次包裝之后以更易理解的方式呈現給讀者——而與其說是查漏補缺的教輔,其實又更像是心得寫得不錯的系列博文,無論你對C掌握程度如何,讀一下多少會有所收獲。
那么之于初學者,相比零基礎或學過其他語言,你最好是學過一點C,哪怕只有一丁點。有不少術語是在不解釋的情況下出現的,你手頭最好還有一本主力教材。本書專打輔助,但把重難點剖析得十分清楚,對初學者快速、準確地掌握知識點很有幫助。如果你有地方看不明白,不必焦慮,它本來就是“點滴”,暫時漏掉幾滴無傷大雅,日后再補不遲。
PS:全書沒啥可吐槽的,唯獨1.2節安排不佳:從搜索引擎、e-mail、聊天工具、社交網站、論壇、博客、下載說起,哦不,是教起,準確地說是零基礎教起,雖然說得挺有意思,但其實沒有必要,現在只要有點文化水平的,即使是小學生甚至幼兒園的小朋友也都會上網,而沒有文化水平的,不識字的,也根本不會用電腦,更不可能來看C語言,換個角度,學C的讀者還不會上網嗎,這些東西是寫給誰看呢?