Intermediate C Programming為什么要寫這本書市面上有成百上千種關(guān)于編程的書籍,其中有很多都是關(guān)于C語言編程的,那么為什么我還要寫這本書呢?為什么建議你花時(shí)間讀它呢?這本書跟其他書有什么不同呢?跟很多作者一樣,我寫這本書是因?yàn)槲矣X得有必要,覺得這本書中的方法比其他書中的更好。
我將現(xiàn)在已有的關(guān)于編程的書分為兩類:入門和進(jìn)階。入門類書是給初學(xué)者寫的,一般都假設(shè)讀者沒有編程基礎(chǔ),所以主要是介紹基本的概念。通常以“Hello World!”程序開始,也就是將“Hello World!”輸出到電腦屏幕的程序。這種類型的書主要是一步步地介紹語言特點(diǎn),包括關(guān)鍵詞、數(shù)據(jù)類型、控制結(jié)構(gòu)、字符串、文件操作等,而這些書一般都有一個(gè)特點(diǎn):程序很短,一般是1~2頁。這很奏效,因?yàn)槎坛绦蛴兄诮忉尵幊陶Z言的新概念。如果把學(xué)編程語言比作學(xué)自然語言,如英語、漢語、法語、韓語等,這些書就相當(dāng)于教導(dǎo)如何造句和撰寫短段落。
第二類書是寫給有程序開發(fā)經(jīng)驗(yàn)的讀者的。這些書主要介紹解決現(xiàn)實(shí)中的問題的程序,比如關(guān)于電腦游戲或者圖像。而這類書的例子一般很長(zhǎng),有些甚至幾千行代碼,因此不會(huì)全部印在書本上。書中只會(huì)解釋程序的其中一部分,而源程序一般保存在CD或者某個(gè)網(wǎng)址上。這類書一般不會(huì)再介紹如何編程,而是大多專注于解決特定問題的算法研究,有時(shí)包括算法性能的詳細(xì)信息。讀者不可能再找到類似于“Hello World!”這樣的例子。再比作自然語言的例子,這類書就是在教導(dǎo)如何撰寫可能超過20頁的短篇小說。
問題是,從寫一個(gè)段落到寫一篇小說,這種跨越太難了。
一本針對(duì)中級(jí)編程能力的學(xué)生的書市面上很少有針對(duì)中級(jí)編程能力學(xué)生的書籍。這些學(xué)生往往已經(jīng)掌握了編程的基本知識(shí),在看到if或者while時(shí)不會(huì)茫然,知道如何創(chuàng)建函數(shù)和調(diào)用函數(shù),有能力編寫幾十上百行的短代碼,卻不知道如何處理上千行的程序。他們經(jīng)常會(huì)犯錯(cuò)誤,因?yàn)榇蠖鄶?shù)入門級(jí)的書籍只教導(dǎo)如何編寫正確的程序,卻不會(huì)教導(dǎo)避免常見的錯(cuò)誤。他們往往對(duì)大多數(shù)的概念和那些可以幫助提高編程能力的工具都不太熟悉,他們需要這樣一個(gè)臺(tái)階:可以幫助他們從有能力編寫短代碼到有能力編寫解決現(xiàn)實(shí)問題的程序。
現(xiàn)在入門和進(jìn)階的空檔已經(jīng)被數(shù)據(jù)結(jié)構(gòu)和算法的書籍填充了一部分,這類圖書一般提供實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)或算法的完整例子。然而這并不是最合適的解決方法,這類圖書致力于介紹數(shù)據(jù)結(jié)構(gòu)和算法,卻罕有提供幫助讀者編寫正確代碼的信息。事實(shí)上,它們大多只提供程序,而很少解釋。它們往往不解釋編程概念,比如函數(shù)需要一個(gè)指針作為實(shí)參的原因或者深拷貝與淺拷貝之間的差異等。因此,讀者只能自學(xué)這些編程技巧。
為了迎合這個(gè)需求,我寫下這本針對(duì)中級(jí)編程能力的學(xué)生的書,本書適合作為學(xué)習(xí)編程的第二本教材。
避免出錯(cuò)和調(diào)試的重點(diǎn)我們可以看到有很多關(guān)于如何編程的書籍,卻很少關(guān)于開發(fā)軟件的書籍。開發(fā)軟件不是簡(jiǎn)單地輸入代碼,它需要更多的知識(shí)和技能。為了彌補(bǔ)這種不足,最好就是去研究什么是對(duì)的、什么是錯(cuò)的。只解釋如何編寫正確的程序是不夠的,還需要解釋常見的錯(cuò)誤并將它們與正確的程序進(jìn)行對(duì)比。
一次疏忽可能使程序運(yùn)行出乎意料,甚至是某些情況下運(yùn)行正確而另一些情況下出錯(cuò)。這種類型的錯(cuò)誤往往很難發(fā)現(xiàn),更別說更正了。本書將介紹一些常見的錯(cuò)誤以教導(dǎo)讀者如何避免這些錯(cuò)誤。調(diào)試過程在大多數(shù)書中都不會(huì)涉及,罕有書籍會(huì)提到“調(diào)試器”這個(gè)詞,以至于有些讀者都不知道這類工具的存在。學(xué)會(huì)如何使用調(diào)試器一般不超過30分鐘,這可以幫助程序員節(jié)省很多時(shí)間。關(guān)于如何使用調(diào)試器和調(diào)試策略的書籍則更少了。
程序設(shè)計(jì)和離散數(shù)學(xué)程序設(shè)計(jì)和離散數(shù)學(xué)是計(jì)算機(jī)科學(xué)中的兩個(gè)重要學(xué)科,然而,大多數(shù)書籍都將這兩個(gè)主題分開,所以很少會(huì)在編程的書籍中看到數(shù)學(xué)公式,同樣也很難在離散數(shù)學(xué)中看到代碼。在本書中,這兩個(gè)主題緊密結(jié)合,我相信讀者可以從中學(xué)到更多的知識(shí)。
為什么本書使用C語言?C語言誕生于20世紀(jì)60年代后期和20世紀(jì)70年代早期。在C語言發(fā)明之后,很多語言也相繼出現(xiàn),這些語言也深受C語言的影響。除了它的歷史影響之外,C語言的簡(jiǎn)單易用也保證了它在幾乎所有現(xiàn)代化平臺(tái)中的重要地位。與許多操作系統(tǒng)一樣,Linux是就用C語言編寫的,Android基本都是用Java編寫的但仍有叫作JNI(Java Native Interface,Java本地接口)的C語言接口。大多數(shù)計(jì)算機(jī)語言都可以與C語言進(jìn)行通信或通過C語言進(jìn)行通信,事實(shí)上這對(duì)一種編程語言而言是有用的,因?yàn)榇蠖鄶?shù)操作系統(tǒng)接口都使用C語言。當(dāng)一個(gè)全新的系統(tǒng)被設(shè)計(jì)出來,C語言通常是第一種(很多情況下是唯一一種)被系統(tǒng)支持的編程語言。
……
Yung-Hsiang Lu(陸永祥),現(xiàn)為普度大學(xué)電子和計(jì)算機(jī)工程學(xué)院副教授。他是ACM杰出科學(xué)家和杰出講者, IEEE重啟計(jì)算計(jì)劃(Rebooting Computing initiative)成員。他還是2015年首屆低功耗圖像識(shí)別競(jìng)賽的主要組織者,IEEE多媒體通信技術(shù)委員會(huì)的多媒體通信系統(tǒng)興趣組的主席(2014-2016)。他2002年獲得了斯坦福大學(xué)電子工程系博士學(xué)位。