恭喜你,在眾多的計算機編程語言中,選擇了C/C 語言,一門業界公認的功能強大、性能極優但學習難度大的計算機編程語言。選擇這門編程語言學習的讀者通常是勇氣和智慧兼具的人; 能夠把這門語言熟練掌握並靈活運用的人也通常是那些能夠在編程道路上走得更扎實、更久遠,基礎和綜合開發實力遠超同齡者的人。
20多年前,從事IT行業的人還不多,當時優秀的程序員也比較少,學習編程知識的途徑也非常匱乏。當今,浩如煙海的知識通過網絡變得隨手可得,人們不得不面對一個新問題: 學什麼以及跟誰學。
在C/C 語言的學習中,經常有許多人手捧著一些國外大師級的人所寫的權威書艱難地閱讀甚至反復地閱讀。
在筆者看來,這種書並不適合初學者。一本好的編程書應該把常用、有用的知識以通俗的語言和講解傳授給讀者,為讀者節約大量的閱讀時間,並使讀者達到事半功倍的學習效果。
筆者認為本書就是能讓讀者用少的時間掌握多且有用知識的書,筆者利用自己20多年一線開發的實踐經驗,把自己認為有用、重要的知識,以通俗的語言講授給讀者,讓讀者在短的時間內達到好的學習效果。
面向的讀者
筆者在24年一線C 開發經驗的基礎之上,編寫這本《C 新經典》,前後累計耗費將近10個月時間,夜以繼日地工作,終於讓它出現在你的手裡。這是一本越看越精彩的C 書。
這是一本專門面向C/C 編程語言開發者的專業書籍,針對C/C 語言,以擇業為導向,主要適合以下幾類讀者:
(1) C/C 語言初學者或者由其他計算機語言轉到C/C 語言的程序員。
(2) 從事C/C 開發多年的程序員,希望詳細地復習基礎的C/C 知識,把整個知識線串一串,形成一個比較完整的學習體繫。
(3) 已經掌握C 98標準,但是需要進一步學習C 11/14/17新標準的程序員。總之,不管讀者是否有很豐富的C 編程經驗,這本書都值得購買,當把這本書拿到手的時候,你就會知道,筆者沒有言過其實。隨著年齡的增加,人的記憶力會逐漸下降,任何人都不可能將書中的每個知識點全部記在腦海裡,所以,沒有比將一本適合自己的書放在身邊,隨時查閱更明智的選擇了!
本書特色
(1) 本書分三部分: 第1部分是C/C 語言概述; 第2部分是C語言; 第3部分是C 語言。
第2部分適合C語言初學者或是想往C 方向轉的程序員,這部分內容也是第3部分內容的基礎,對於沒有基礎的讀者,千萬不可跳過這部分內容,筆者這裡所講解的每一個知識點在第3部分學習C 時都有用。
(2) 本書覆蓋面廣,講解細致入微。
(3) 講解的手段非常全面: 演示、調試、加斷點、看變量、看內存都用上了。
(4) 坑點會反復強調,理論與實戰結合,舉例恰到好處,通俗易懂。
C 開發的經典書不少,並且絕大部分經典書都出自外國人之手。許多讀者在閱讀這些書時,都會遇到讀一遍完全沒有讀懂,隻有反復閱讀多遍,纔能理解書中之意的情形,尤其是C 11新標準推出以來,增加太多新的晦澀的概念、術語和知識點,進一步加重了學習者的負擔,甚至讓很多學習者望而卻步。
很多名氣大的作者寫的書讓人非常難以讀懂,是因為他們是在用專家思維寫書,結果必然是難以讓普通大眾讀懂。生活中這樣的人有很多,例如他自己明白一些知識,但隻要是講給別人聽,一定會把別人講糊塗。所以,水平高、開發實力強並不代表能寫出好書。當然,反過來說,如果水平很差,當然也不可能寫出好書。
在筆者看來,一本能夠稱得上經典的好書應該是通俗易懂的,對於讀者來講,認真讀一遍就應該能夠讀懂,而讀多遍的目的應該是深入理解和加深印像。《C 新經典》正是一本認真讀一遍就能讀懂的書,書中筆者利用數十年一線開發所積累的豐富經驗,配以大量精準到位的演示範例,把難以理解的內容通俗易懂地講述明白,讓讀者收獲滿滿。可以毫不誇張地說,這本書完全能夠讓讀者感覺相見恨晚。讀懂本書並認真實踐書中的範例,至少相當於為讀者增加了5年以上C 開發的功力,也就是說,至少為讀者5年的學習時間。
筆者具有講課天賦,筆者有信心讓一個從未學過C/C 程序開發的讀者通過本書的學習成為C/C 開發高手。所以,對於轉行到C/C 語言開發程序的讀者,完全不用擔心看不懂本書。但是,對於學習知識這件事,筆者堅持認為: “扶上馬,送一程”,讓讀者具備扎實的基礎以及自我學習的能力是非常重要的。因此,要走得遠,飛得高,終還是要靠自己經年累月的不斷努力和磨煉。
翻看本書的目錄,讀者不難發現本書的優秀和全面。除了C 基本理論知識,書中還詳盡介紹了高級模板話題、智能指針、並發與多線程、內存高級話題、STL標準庫,以及C 11新標準中引用、類型推斷、引用折疊、完美轉發、萃取技術等,這些知識,是真正成長為C 開發大師必知必會的知識。其實,書中很多內容的講解已經超越了C 基礎語言本身,邁向了更高的層次,讓讀者不但扎實地掌握基礎,更有認知的大幅度提升。同時,書中的每個範例,都經過了筆者的深思熟慮,都會演示不同的知識點,所以每一個範例都重要,都不可錯過。
在成書的過程中,筆者參考了大量C 經典著作並盡努力通過網絡尋找一切對本書的寫作有用的資料,盡量不遺漏任何重要的知識,筆者的心願是通過自己的表達把這些知識更通俗地傳授給讀者,讓讀者隻花費1/5甚至1/10的精力就能獲得相同的知識,讓讀者能夠憑借本書盡早地找到工作,獲得一項謀生的本領。對於書中內容,筆者進行了大量資料的參考和整合,付出了數月的時間和極大的心血。在這裡,筆者發自內心地感謝諸多C/C 前輩在這個行業中多年的耕耘及對知識的積累和傳播的貢獻。
C/C 語言博大精深,本書並不是C/C 語言語法大全,事實上,沒有任何一本書可以事無巨細、面面俱到地把每個知識點都講解到。同時,筆者是一個實用主義者,筆者認為,生命有限而學海無涯,相信對於絕大多數人,學習C/C 開發知識,目的是實實在在地賺錢養家,而不是為了搞學術研究。所以,雖然本書中知識覆蓋面廣,但不是什麼內容都往書中放。在C/C 龐大的知識體繫中,相當一部分知識是很少用到的,花費大量篇幅去詳細闡述無疑是事倍功半,這個時候,筆者豐富的一線開發經驗就起到了極大的作用——憑借多年的實戰經驗,幫助讀者甄別重要的知識,盡量避免讓讀者浪費大量時間去學習那些很不常用的知識,保證讀者在短的時間內大幅度地提升自身的實力。
本書已經把C/C 語言開發中常用功能的90%都介紹了,能夠滿足絕大多數讀者日常工作所需,如果偶爾有遺漏的地方,讀者完全可以通過自學來彌補。筆者深信,把這麼多年工作中的所思、所想、所積累的有用知識點彙集在一本書中,該書的質量將超越絕大多數市面上的C/C 類書。
關於習題集
本書範例眾多,因此筆者認為並不需要專門的習題集,或者可以說,這些範例本身就是絕好的習題。雖然筆者認為做大量的習題對實際工作的幫助並不大,但如果讀者特別在意學後做題以鞏固所學,比如學習了“構造函數”的概念之後,筆者建議,通過搜索引擎搜索“C 構造函數 練習”這種關鍵詞,能夠搜索到大量相關的習題,通過完成這些習題,就可以驗證自己的學習成果。
同時,筆者要指出,這些習題的完成,一般來講,隻代表在C/C 語言使用層面達到了一定的熟練度,具體在實際工作崗位上如何應用這些知識解決問題還需要在工作中去感受和體會。解決實際問題這件事,讀者不要把它想得很難,其實它可能非常簡單,人們往往都會對自己不熟悉的事物產生一些本能的畏懼,直接面對它,這種畏懼感自然消失。
如果真要做題,筆者建議讀者學會整本書後一起做,從而綜合地驗證自己的學習成果。
閱讀進度
不排除有基礎和學習速度特別快的讀者可以很快把本書的內容閱讀完畢並掌握得很好,但通常來講,筆者建議采取如下的閱讀進度:
整本書大概有120節(比如1.1標題算一節),筆者建議讀者每周平均學習2節。整本書後半部分內容比前半部分內容學習難度更大、篇幅更多,所以後半部分每節的學習時間要多,但是平均下來,筆者認為每周學習2節還是能夠做到的,這意味著整本書大概需要花費400多天的學習時間,如果加快學習進度,讀者可以力爭在1年之內將本書學完。
在學習過程中,強烈推薦讀者跟著筆者一起實踐書中的每個範例,驗證範例的正確性,實踐是深化知識的一個極其重要的過程,這樣學習效果將比隻用耳朵聽和用眼睛看強出3~5倍,千萬不要偷懶,既然決定走程序開發這條路,現在的勤奮就是為了讓自己以後少一些被動。若干年後,筆者不希望看到當年稱自己一聲老師的讀者頂著生活的壓力,還在費盡心力地調試Bug。筆者自己的成長經驗是: 盡心編程10年後,程序中出現Bug的概率就非常小了,當我達到15年編程經驗,往20年跨越的時候,偶爾的小Bug基本都隨時發現隨時消滅,偶爾出現的問題可以立即解決。讀者千萬不要以為程序員寫出Bug是家常便飯,更不要以改Bug為榮。
本書內容全是重點,建議讀者將整本書仔細學完,一節都不要錯過。通過這樣仔細的學習,本書包含哪些內容,在讀者心中就會有一個比較深刻的印像,此時,這本書就可以當作讀者的貼身伙伴和工具書了——忘記了哪個知識點,或者想使用哪些編程技巧,隨時翻開書查閱。
知識點千萬不要死記硬背,隨著讀者學習知識的增多,會面臨著學過的知識很快忘記的情形,這很正常,所以在大多數情況下,我們的頭腦裡往往隻記錄一個知識點的大概思路和解決方法的索引(位置),需要解決類似問題的時候能找到這個索引,翻閱資料來解決就非常好。
請記住,一個高級程序員甚至架構師的能力體現不在於記住多少高級復雜的代碼(在筆者看來,能記住的復雜代碼越多,往往意味著當下真正所掌握到的知識還太少),而在於把控項目的綜合能力、解決問題時能夠把所有細節、意外全部想到的縝密邏輯思維,而且實際動起手時很少犯錯。這些,纔是一個程序員的大成智慧,纔是需要數年乃至數十年纔能練就的。
另外,對於一個高級程序員來講,一個知識點不會時,可以繞道而行或者研究明白這個知識點再使用,但絕不要濫用、瞎用導致產生Bug或使自己掉坑裡去而影響整個團隊甚至公司的運作。
運行環境
本書的範例全部在Windows下的Visual Studio 2019集成開發環境中調試通過。之所以選擇這個平臺,是因為它對開發者相當友好,開發和調試程序特別方便,尤其對初學者,極大降低了學習難度。
書中也詳細闡述了在Windows下安裝Visual Studio 2019的過程。因為書中講解的內容涉及C 11及更新的C 標準語法,所以如果是在Windows操作繫統下進行程序開發,建議讀者使用Visual Studio集成開發環境並保證版本不低於Visual Studio 2017。
對於在Linux下從事C/C 開發的讀者,隻要C/C 編譯器支持C 11及更新的C 標準語法,就完全沒有問題,因為本書針對的是C/C 語言,所以本書中99.9%的範例都可以跨操作繫統平臺運行。
資料獲取
本書有完整的配套學習資料(源碼),讀者可以免費獲取。獲取方法如下。
(1) 查找並關注“程序員速成”微信公眾號。
(2) 在微信公眾號中,輸入“新經典”三個字,就可以獲取配套學習資料下載鏈接。
讀者評論
筆者在出版本書之前,有數月的時間,通過網絡推出課程以教授C/C 開發知識,課程推出之後,收到了太多好評。這裡摘錄一部分評論:
現在別人追劇,我就追王老師的課,確實高校一些老師講的C 跟王老師講的根本不在一個水平線。
學歷看學校,本領學王老師。
聽王老師的課感覺自己智商變高了,原來自己看書看不懂的內容聽王老師的課後發現自己能懂了。
從4月底無意中發現這門課程以來,歷時半月,加上假期,終於把所有課程學完了,真正是欲罷不能,講得實在是太棒了。條理清晰,例證豐富,重要是把各種使用中將遇到的陷阱都講得很到位。而且,本課程涵蓋了C 繫列版本的主要知識點,幫我完整梳理了C 的知識,真是感激不盡。後一章的總結也非常精準到位,每一句都是金玉良言,飽含工作經驗和人生體會。再次表示感謝,期待王老師的實戰課程。謹祝王老師身體健康,工作順利。
翔實、實用的舉例,不多話,不廢話。
非常好,老師是經驗豐富的大牛,講課清楚並且邏輯強,王老師的課可以說是我聽過的好的C 課程了。
目前看過的所有C 課中,含金量的。相見恨晚,感謝老師。
C 工作14年的老菜鳥來學藝,希望能得到質的飛躍!技術這東西不服牛人不行,有些地方自己自學不隻是多走彎路的事兒,是根本入不了道。
感謝王老師,我之前買過其他C 課程,但是深度和您的課程無法相比。相信您的課程能改變我的命運,非常感謝王老師。我要好好努力。
老師我現在看了你的部分課程,覺得你講得很細很好,你會出一本書把你講的內容寫上去嗎?很期待啊,看老師的課程的進展快多了,很感謝老師出那麼好的課程,幫我省去不少時間。
老師的C 講得實在太好了,看了纔體會到這是下了大功夫做的教程,比我之前看的教程高了一個檔次。
我好喜歡老師講的課啊,通俗易懂有意思,比××教育強太多了。
老師,真的很喜歡您的課程,能再多出幾期課程嗎?我還會買的。
謝謝老師,說真的,老師講得真好,19歲開始學編程,先專升本再考研,2018年畢業。老師,是C 講得很好的老師,盡管我學過十幾種編程語言,但是跟著老師學,很輕松。老師講得真棒。現在從事AI、圖像處理的工作,公司用Python做的demo做好了,就是速度跟不上,看老師講的C ,有種想哭的感覺,為什麼不是在幾年前看到這個課程,現在早就穩穩地掌握C 了,有點功利。感謝老師,分享自己的工作經驗。
老師,你什麼時候可以出一門有關C或C 的數據結構和算法的課程呢? 很期待。自從聽你的課! 就已經是你的鐵杆粉絲了!
真的講得很仔細,對於不喜歡看書的人來說,王老師的課是福利,兩年前出這個課程,我看我會飄的。
老師,在我上大學的時候怎麼沒出這個課程呢?
通俗易懂,幽默風趣,講課方式獨具一格。
很贊,很多平時沒有注意到的細節都講到了。
跟著老師的講課做完的筆記,就是活字典啊,哪裡忘了搜哪裡。
不愧是老“司機”,用通俗易懂的方式講解每一個知識點,簡直就是講活了書本啊。
老師講得非常好,都是干貨,沒有廢話,邏輯清楚,而且一聽就是肚子裡有東西。邊講,邊寫代碼,更有助於學生理解和吸收知識。
好的老師,萬事俱備,剩下的就剩你自己學不學了。
老師的課是我見過的C 講得很好的,我非常開心也非常榮幸能買到老師的課程,等我學完老師所有課程後,如果老師不反對,我想拜老師為師,交學費給您,以後工作中有不懂的問題,多向您請教。
語言學習體會
學好一門計算機語言,有三個關鍵的要素:
(1) 有一本能夠領著大家入門的好書,好書應該是出自好老師之手,而一個具有豐富的實戰經驗和講課天賦的好老師,一定能讓大家不踩坑,不浪費時間,至少眼下不必去掌握各種額外知識,節約大量學習時間,大幅度地加快學習速度。
(2) 不停地努力是根本,也就是不斷地學習,不斷地實踐,多看優秀的人寫的代碼,並且要自己多動手參與實際項目寫大量代碼。連續寫10年代碼,你的代碼中就會很少出現Bug,連續開發項目15年,你大概就能掌握用的效率解決各種開發問題,連續開發20年基本就達到大神的級別了。大家可能覺得這個時間太長了,筆者其實蠻希望大家打破這個魔咒,用更短的時間進階到大神級,有這個目標的同學就更要跟著筆者一起努力了。
(3) 舉一反三,任何書都不可能面面俱到地講解每一個細節,否則會浪費大家很多時間,因為絕大部分知識在實際工作中是用不到的,所以大家一定要積極自學,善用搜索引擎,就可以很輕松地掌握很多新知識。
致謝
二十多年前,筆者寫過一本《Crystal Reports水晶報表設計與開發實務》,這本書的寫作實在是太辛苦,每天大概要寫到凌晨3點纔能休息,熬了3個多月。書完成之後,整個人瘦了好幾圈。
雖然書有一定的銷量,但是跟付出感覺不成比例。所以,從那時候開始,筆者就暗下決心,從此以後再也不寫書了。
“人算不如天算”,2018年下半年,筆者通過網絡,逐步發布一些C/C 類網絡課程,讓人意外的是,這些課程獲得了學員極好的口碑,大有超越市面絕大多數C/C 類課程之勢,在這個時候,清華大學出版社電子信息教材事業部主任、首席策劃盛東亮先生找到筆者,希望筆者能夠寫一本優質的C/C 類圖書。
因為多年前出書的心理陰影,筆者當時本能地拒絕了,但在筆者的心裡卻從此埋下了寫書的種子。
幾個月之後,筆者終於想通了寫C/C 類圖書這件事,感覺有兩點好處:
(1) 幫助更多的讀者邁入C/C 之門,也是為社會盡一點自己的微薄之力,做一個對社會有用的人。
(2) 擴大自身的知名度,增加收入,畢竟筆者也需要養家,通過自己的勞動賺取收入,這是光榮的。
當筆者把出書的想法說給盛東亮先生聽的時候,他非常高興並與筆者做了深入的溝通,我們二人年紀相仿,聊得很投機,在寫書這件事情上觀點也非常一致——希望這是一本高質量的、經典的C 圖書,是一本可以擺在書架上10年甚至20年的書,如果僅讓讀者選那麼2~3本好的C 圖書時,希望本書是其中之一。
在本書寫作、出版的交流過程中,盛東亮先生給予了筆者相當多的支持與鼓勵,甚至可以說,如果不是盛東亮先生當初的接洽和後續順暢愉快的交流,如果不是許多實際的工作都能在短的時間敲定並逐一落實,這本書也許根本不會出現在讀者面前。所以,這份感謝,筆者要送給你——盛東亮先生。
筆者另外一個要感謝的人是清華大學出版社的資深編輯鐘志芳老師,在本書寫作、出版的過程中,因筆者對出版社的體例格式比較陌生,對寫書過程中許多書面用語把握得不夠精準,在書稿中出現了不少的格式問題和用詞問題,鐘老師通過在文檔中加入極細致的批注給予了相當專業的指導,即便苛刻的格式要求讓筆者心生恐懼並多次抱怨,鐘老師都能夠寬容理解。所以,這份感謝,筆者要送給你——鐘志芳老師。
後
本書後記“IT職業發展的未來之路”,有筆者已經過半的人生——走過了24年開發之路後留下的一些人生感悟,強烈推薦讀者率先閱讀。
C 知識體繫龐雜,雖然筆者非常盡心盡力,但限於水平,書中疏漏在所難免,懇請各位讀者不吝指教。
王健偉2020年5月