點擊關注 異步圖書,置頂公衆號程序員
天天與你分享 IT好書 技術乾貨 職場知識算法
參與文末話題討論,每日贈送異步圖書編程
——異步小編數組
今天咱們要讀的是一本經久不衰的C語言暢銷經典教程,自1984年初版誕生以來,它持續暢銷了34年,升級了6個版本,是程序員們學習C語言不可多得的良師益友,它就是《C Primer Plus(第6版)中文版》。安全
提到C語言,就繞不開計算機編程語言的演變與進化。這足以證實C語言在整個編程領域舉足輕重的地位。C語言不是憑空出現的,它的背後老是伴隨着長長的故事,有時候都不知道從哪裏開始講起……
微信
C語言的前身是B語言,而B語言的前身是BCPL語言,BCPL又源自CPL語言,CPL在Algol 60的基礎上發展而來……那麼,咱們就從這裏開始吧。多線程
在高級編程語言的進化史中,不得不提ALGOL。1950年,歐美計算機學家協力開發了ALGOL。ALGOL是算法語言(ALGOrithmic Language)的簡稱,也是在計算機發展史上首批清晰定義的高級語言。國際計算機學會(Assocoation for Computing Machinery,簡稱ACM)將ALGOL模式列爲算法描述的標準,啓發了ALGOL類現代語言Pascal、Ada、C等語言的出現。異步
Algol 58編程語言
1958年,ACM與當時聯邦德國的應用數學和力學協會(Gesellschaft für Angewandte Mathematik und Mechanik,簡稱GAMM)出席了在蘇黎世舉行的第一次程序設計會議,把新語言命名爲IAL,即國際代數語言(International Algebraic Language,簡稱IAL),後定名爲ALGOL,即算法語言。後來,又改成Algol 58,成爲ALGOL家族的第一位成員。函數
Algol 60
1960年1月,圖靈獎得到者艾倫•佩利(Alan J.Perlis)在巴黎舉行的頂級軟件專家研討會上,發表了「算法語言Algol 60報告」,肯定了程序設計語言Algol 60。1962年,艾倫•佩利又對Algol 60進行了修正。
Algol 60引進了許多新的概念(如:局部性概念、動態、遞歸、巴科斯-諾爾範式BNF等等),是程序設計語言發展史上的一個里程碑。它標誌着程序設計語言成爲一門獨立的科學學科,併爲後來軟件自動化及軟件可靠性的發展奠基了基礎。Algol 60是許多後來的程序設計語言必不可少的軟件工程工具的原型,它的發展是一羣極具天賦的人的工做成果。
CPL(Combined Programming Language)
1963年,英國劍橋大學在Algol 60的基礎上開發出了CPL語言。CPL語言更接近硬件一些,但規模比較大,難以實現。
BCPL(Basic Combined Programming Language)
BCPL源自CPL語言。1967年,英國劍橋大學的馬丁•理察德(Martin Richards)在訪問麻省理工大學期間,對CPL語言進行了簡化,移除了該語言中最複雜的部分,設計出了BCPL語言。該語言在70年代早期普遍應用於不少項目中,是最先被用作牛津大學OS6操做系統中的開發工具。後來,通過美國貝爾實驗室的改進和推廣,成爲了UNIX上的經常使用開發語言。
BCPL有些相似於Fortran,也是典型的面向過程的高級語言。BCPL也是最先使用庫函數封裝基本輸入輸出的語言之一,因此它的跨平臺移植性很好。與同時代的BASIC和PASCAL不一樣,BCPL的代碼用小寫字母書寫。早期BCPL的內存管理很糟糕,不事後來獲得了改善。可是,BCPL對字符串的支持不好,這個缺點一直沒有解決。
做爲早期的編程語言,BCPL現在已再也不普遍使用,但它的影響倒是深遠的。BCPL程序從一個主函數中開始,能夠在各個函數中添加功能模塊,函數支持嵌套和遞歸。BCPL是第一個使用括號的語言(現在,括號在各類編程語言中都隨處可見)。
B語言
1970年,美國貝爾實驗室的研究員肯•湯普森(Ken Thompson)本身編寫了一個模擬在太陽系航行的電子遊戲:Space Travel。他找到一臺沒有操做系統的空閒機器PDP-7,而遊戲必須使用操做系統的一些功能,因而他着手爲PDP-7開發操做系統。可是,用現有的語言在這臺機器上開發操做系統,困難重重。湯普森刪減了BCPL語言其中的非必備組件,開發出了一種通用的程序設計語言:B語言(取BCPL的第一個字母),並用B語言寫出了第一個UNIX操做系統。
B語言是一種無類型語言,全部的數據都和機器字相對應。B語言很是簡單,並且更接近硬件,程序員能夠直接經過內存地址操做內存。B語言除包含一些庫函數外,還包含了湯普森的一些我的偏好(主要在一些特定的程序中減小非空格字符的數量)。雖然B語言的使用時間不長,可是它在編程語言發展歷史上起到了承前啓後的重要做用。
圖1 DEC的PDP-7
C語言
好景不長,B語言的無類型特性成爲在PDP-11機器上訪問字符類型的軟肋。1971年,一樣酷愛Space Travel的丹尼斯•裏奇(Dennis M.Ritchie)爲了能早點兒玩上游戲,加入了湯普森的開發項目,合做開發UNIX。他的主要工做是改造B語言,使其更加成熟。其中最重要的改動是,把數據類型的概念引入到B語言中。丹尼斯•裏奇在B語言中增長了字符類型,同時也把B語言的編譯器修改成生成PDP-11的機器指令。他稱這個稍微擴展的語言爲NB,也就是「New B」。
圖2 肯•湯普森(左)和丹尼斯•裏奇(右)
1972年,丹尼斯•裏奇通過不懈地努力,在B語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母做爲這種語言的名字,也就是C語言。
1973年初,C語言的主體完成。湯普森和裏奇火燒眉毛地開始用C語言所有重寫了UNIX。此時,他們一門心思地投入到C語言和UNIX的開發中,徹底沉浸在編程的樂趣中,早就忘了那個曾經的Space Travel遊戲。
1977年,丹尼斯•裏奇發表了不依賴於具體機器系統的C語言編譯文本《可移植的C語言編譯程序》。
1978年,美國電話電報公司貝爾實驗室正式發佈了C語言。布萊恩•柯林漢(Brian Kernighan)和丹尼斯•裏奇共著的《The C Programming Language》(《C程序設計語言》)出版了。這本書被C語言開發者們稱爲「K&R」,不少年來都被看成C語言的非正式標準說明。人們稱這個版本的C語言爲K&R C。
1983年,ANSI爲了讓C語言健康地發展下去,在當年夏天成立了一個在CBEMA指導下的X3J11委員會,制定C語言標準。該委員會由C語言做者和應用程序員、硬件廠商,編譯器及其餘軟件工具生產商、軟件設計師、顧問、學術界人士組成。
1989年,X3J11委員會在年末發佈了ANSI89報告。隨後,ANSI發佈了第一個完整的C語言標準:ANSI X3.159-1989,簡稱「C89」,也就是ANSI C或C89標準。
1990年,國際標準化組織(International Organization for Standards,簡稱ISO)和國際電工委員會(IEC)接受了1989年的ANSI C爲ISO C的標準,命名爲ISO/IEC 9899:1990。因爲該標準發佈於1990年,因此也稱之爲C90標準(不過習慣上仍然叫C89標準)。實際上,C90標準與C89標準徹底等同。
1995年,ISO對C90作了一些修訂,即「1995基準增補1(ISO/IEC/9899/AMD1:1995)」。在ANSI標準化後,儘管C語言自己在繼續改進,可是C語言的標準在一段很長的時間內都保持不變。
1999年,在作了一些必要的修正和完善後,ISO發佈了新的C語言標準,命名爲ISO/IEC 9899:1999,簡稱「C99」。
2011年12月8日,ISO正式發佈了C語言的最新標準C11。因爲以前不知道具體的發佈時間,曾被稱爲C1X,官方名稱爲ISO/IEC 9899:2011,簡稱「C11」。新標準提升了對C++的兼容性,並增長了一些新特性。
在1973至1980年間(從C語言主體完成到C語言標準發佈以前),特別是1977年左右,C語言的變化主要集中在考慮可移植性和類型安全上,探討如何處理將大量代碼移植到新平臺時出現和潛在的問題。在這時期,C語言增長了unsigned、long、union和枚舉類型。在此以前,C語言還保留着不少無類型的特徵。例如在早期語言手冊或代碼中,指針與整型內存索引幾乎沒有區別;字符指針和無符號整數的算術特性類似,很容易讓人混淆。添加unsigned類型使得無符號整數的運算區別於指針運算。另外,早期C語言還容許整數與指針之間的賦值(即便在當時,這種作法也不受鼓勵)。隨後,C語言引入了一個類型轉換符號(在Algol 68中被稱做「cast」),專門用於類型轉換。
到了1982年,雖然K&R C一直被當成C語言的非正式標準,可是它卻不能很好地反應實際使用中的C語言。尤爲是它沒有說起void和enum類型。雖然《The C Programming Language》中提到了(構成)結構體的新方式,可是在該書發表後C語言才支持與結構體相關的一些操做,包括對其賦值、將其傳遞給函數和從函數返回等。儘管AT&T發佈的編譯器和大多數編譯器供應商都很快地添加了這些變化,可是當時仍然沒有一個完整、權威的語言描述。C語言亟需進行標準化。
1983年,ANSI爲制定C語言標準成立了X3J11委員會。該委員會對C語言進行了一項重大改變,借鑑了C++[Stroustrup 86]的作法,在函數簽名中添加了形參的類型。在此以前,C語言的外部函數聲明是這樣的:
double sin();
這種聲明只能說明sin是一個返回double類型值的函數。而改進後的聲明是這樣的:
double sin(double);
該聲明顯式表示了函數形參的類型,更方便進行類型檢查和轉換。同時,委員會也意識到,雖然新的聲明形式更好,可是直接廢除舊式風格的函數聲明和定義並不合適。這就不得不妥協,容許兩種形式共存。
C語言自己並未提供輸入/輸出或任何其它與外界交互的方式,而僅依賴一套標準函數。X3J11委員會意識到詳盡地描述標準C庫與描述C語言自己同等重要,因而花費了大量時間來設計庫函數,並將其寫入文檔。另外,X3J11委員會還對C語言其餘方面進行了一些小的改動。好比,增添了兩個類型限定符:const和volatile,改進了不一樣類型的轉換規則等。儘管如此,在整個標準化過程當中,C語言的核心部分並未改變。大部分重要的改動都發生在語言的外層:預處理器和庫函數。預處理器主要是執行宏替換的功能,使用着與語言其餘部分大相徑庭的規則。預處理器與編譯器之間的交互一直描述得不太清楚,X3J11試圖解決這一問題。顯然,C89標準比K&R C給出的解釋更好更全面。另外一方面,在發佈的C89標準中並未正規化定義C語言的語義,從而致使了在一些小細節上仍存在爭議。
下面總結了一下C語言各標準的一些主要變化。
K&R C引入瞭如下幾個主要的語言特性:
1. 標準I/O庫
2. 新增struct、long int、unsigned int數據類型
3. 組合操做符=op的形式改成op=
C89相對於K&R C的一些主要變化:
1. 新增函數原型,對函數的輸入參數進行嚴格類型檢查
2. 新增void、const、volatile、signed、enum關鍵字,刪除了entry關鍵字
3. 容許結構自己做爲參數傳遞給函數
4. 新增#elif、#error、#line、#pragma預處理命令
5. 定義固有宏:_ _LINE_ _、_ _FILE_ _、_ _DATE_ _、_ _TIME_ _、_ _STDC_ _
6. 增長了真正的標準庫
C99相對於C89的一些主要變化:
1. 新增restrict指針
2. 新增inline函數說明符,支持內聯函數
3. 新增_Bool、long long int、unsigned long long int數據類型
4. 加強printf()和scanf()函數組
5. 加強數組,支持可變長數組,容許數組長度在運行時才肯定,可在數組聲明中使用restric、volatile、const關鍵字
6. 擴充了標準庫和頭文件,新增_ _func_ _預約義標識符
7. 支持複合賦值
8. 支持//單行註釋
9. 支持變長數組,
10. 支持在for語句的初始化部分定義一個或多個變量
11. 修改了一些預處理程序
12. 變量聲明沒必要放在語句塊的開頭
13. 初始化結構時容許對特定元素賦值
14. 取消函數返回類型默認爲int的規定
C11相對於C99的一些主要變化:
1. 新增_Noreturn函數說明符
2. 新增_Static_assert()靜態斷言
3. 新增_Generic關鍵字,支持輕量級泛型編程
4. 新增_Atomic類型限定符、<stdatomic.h>頭文件
5. 新增_Thread_local存儲類說明符、<threads.h>頭文件,支持多線程
6. 新增_Alignas對齊說明符、_Alignof操做符、aligned_alloc()函數、<stdalign.h>頭文件
7. 新增了一些處理浮點數和複數的宏
8. 新增<uchar.h>頭文件,支持加強的Unicode
9. 新增at_quick_exit()、quick_exit()函數
10. 新增邊界檢查函數結構,定義了新的安全的函數,例如fopen_s()、strcat_s()等
11. 在<time.h>頭文件中新增timespec結構體,時間單位爲納秒;原來的timeval結構體,時間單位爲毫秒
12. 支持匿名結構體、聯合體
13. 支持新的fopen()模式,增長了新的建立、打開模式「x」
14. 刪除了gets()函數(C99中已不推薦使用),提供了更安全的替代函數gets_s()
《C Primer Plus》1984年第1版問世時,用C語言編程的人並很少,許多人都是在這本書的幫助下掌握了C語言。也就是從那時起,C語言開始蓬勃發展。《C Primer Plus》一直都深受編程愛好者的歡迎,自問世以來各版本累計銷售量已經超過55萬本。
1984年1月,《C Primer Plus》第1版問世。那個時候,你們都以《The C Programming Language》做爲C語言實際使用的非正式標準說明。全書448頁。
1993年4月,《C Primer Plus》第2版出版。距第1版出版,已過了9年。這些年裏,X3J11委員會於1989年末發佈了C89標準。1990年,ANSI接受了C89,並命名爲ISO/IEC 9899:1990,也就是你們熟知的C90標準(C89和C90標準徹底等同)。本書爲適應C90標準,作了全面更新。
1999年,《C Primer Plus》第3版出版。在過去的6年裏,ISO對C90作了一些修訂。本書也根據這些修訂進行了更新。雖然C語言自己在不斷地改進和完善,可是從1990年C90標準發佈後,C語言標準近十年都保持不變。
2001年9月,《C Primer Plus》第4版出版。做者Stephen Prata的目標始終未變,他致力於寫一本具備啓發性、條理清晰的C語言入門書。書中也保持着一慣的風格,用許多短小的代碼示例展現語言概念,讓讀者明白會用。在每章末尾設置複習題和編程練習,幫助讀者消化一些容易混淆和難以理解的概念。1999年,通過多年的修正和完善,ANSI正式發佈了C99標準。本書也爲了適應C99標準,在第3版發行僅兩年就立刻根據當時的最新標準,對本書進行了更新。通過前幾版的修訂,全書從第1版的448頁增長到970頁。
2004年12月,《C Primer Plus》第5版出版。在C99標準發佈後,又掀起了學習C語言的高潮。爲了讓你們更好地學習和理解C語言,做者在不改動章節佈局的前提下,新增了大量插圖和表格,以闡明一些不容易用語言描述清楚的概念。全書特別標出了C語言的主要特性,便於讀者往後參考和回顧。在這一版中,做者也反覆強調讀者應該親自動手把代碼示例輸入系統中運行。實踐和理論結合才能牢固地掌握所學的知識。除此以外,還鼓勵讀者要多嘗試修改程序,看看編譯器給出什麼警告,體會一下運行修改後的代碼會出現什麼不一樣的狀況。練習得越多,思考得越多,學得就越多,掌握得就越牢。全書984頁。
2013年12月,《C Primer Plus》第6版出版。2011年12月,ISO正式發佈了C語言的最新標準C11。相對於第5版,這一版根據最新的C11標準,作了全面的更新,增長了許多內容。正如介紹中說的,隨着C語言的發展,從早期的非正式K&R C標準,到1990年的C90標準、1999年的C99標準,再到2011年的C11標準,本書也在日趨成熟和完善。全書1080頁。
從以上《C Primer Plus》各版本的歷史看,最明顯的變化就是全書的頁數。從最初的448頁劇增到最新版的1080頁,這也從另外一個角度見證了C語言的發展歷程。能夠說,這本書是和C語言一塊兒成長起來的。在亞馬遜上,本書的各版本一直都是好評如潮。雖然書愈來愈厚了,可是做者的寫做思路和目標一直都頗有清晰。對於中高級讀者而言,這本書的講解可能稍顯囉嗦,還時常重複講到一些已經介紹過的概念。可是,初學者須要的就是這些。這本書主要是針對初學者編寫的,做者在書中也提到過,假設讀者是沒有任何編程經驗的。在閱讀本書的過程當中,能感覺到做者循循善誘的指導。初學者能毫無壓力地自學完本書。
其實,如今市面上許多編程書籍對初學者都不太友好。看上去厚厚的一本,學習的過程當中感受本身學了不少,也記下了很多知識點。可是,在具體動手編程時,卻每每束手無策。雖然打開了編譯器,但卻愣在那裏不知道怎麼作,這每每是初學者腳下的一塊絆腳石。不少人就是在這裏被絆倒,中止了學習的腳步。有些人爲此大傷腦筋,刨根問底,彷佛怎麼學都不得法。究其問題的根源,不在讀者。對初學者而言,特別是零基礎的初學者,最須要的不是詳盡深奧的原理分析,而是完整的代碼示例。《C Primer Plus》這本書最大的優勢就在於,至始至終都有詳盡完整的代碼示例。讀者只需循序漸進,把代碼輸入編譯器就能運行程序。就算一開始什麼也不懂,可是隻要程序能運行,初學者就會對學習抱有信心和興趣。這本書給了初學者寶貴的信心和繼續學下去的動力。一邊看代碼,一邊閱讀後面逐條代碼的詳細分析。隨着學習的深刻,反覆敲打代碼更有助於理解晦澀抽象的概念。慢慢地,本身也會用了。看到本身寫的代碼編譯經過時,那種發自心裏的愉悅是對學習最大的鼓勵和確定。這本《C Primer Plus》的確是學習C語言不可多得的良師益友。
Stephen Prata是加利福尼亞的馬林學院(肯特菲爾德)的一位物理學和天文學教授,曾在教授天文學、物理學、離散數學和計算機程序設計課程,現已退休。他在加州理工學院得到學士學位,在加州大學伯克利分校得到博士學位。Stephen教授是美國天文學會的成員,也是富布賴特學者。他最先接觸程序設計,就是爲了用計算機給星團建模。Stephen撰寫和與他人合著了十幾本書籍,其中包括《C++ Primer Plus》和《Unix Primer Plus》。
《C Primer Plus》第6版詳細講解了C語言的基本概念和編程技巧。值得一提的是,C99和C11新增的內容,在目錄上均用括號特別註明,方便讀者查閱。全書共17章,可分爲三個部分。
第一部分預備篇(第1~2章),用較少的篇幅介紹學習C語言所需的預備知識。
第二部分基礎篇(第3~15章),每章都詳細講解了C語言的相關知識。包括數據類型、格式化輸入/輸出、運算符、表達式、語句、循環、字符輸入和輸出、函數、數組和指針、字符和字符串函數、內存管理、文件輸入輸出、結構、位操做等。
第三部分提升篇(第16~17章,附錄B參考資料),介紹C預處理器、C庫和高級數據表示。附錄的參考資料中詳細介紹了C語言和編程方面的一些補充知識,還包括新增的C99和C11的標準ANSI C庫。
因爲本書主要針對初學者編寫,在講解知識點時力求詳細,以幫助沒有編程經驗的初學者們理解抽象的概念。書中以完整的程序爲例,講解C語言的知識要點和注意事項。同時,完整的代碼示例中還附有詳細的註釋說明,幫助初學者更好地理解程序。每章末設計了大量複習題和編程練習,幫助讀者鞏固所學知識和提升實際編程能力。本書可做爲C語言的教材,適用於須要系統學習C語言的初學者,也適用於鞏固C語言知識或但願進一步提升編程技術的程序員。
【美】Stephen Prata(史蒂芬 普拉達)著
點擊封面購買紙書
經久不衰的C語言暢銷經典教程
針對C11標準進行全面更新
與之前的版本同樣,做者的目標仍舊是爲讀者提供一本入門型、條理清晰、看法深入的C語言教程。做者把基礎的編程概念與C語言的細節很好地融合在一塊兒,並經過大量短小精悍的示例同時演示一兩個概念,經過學以至用的方式鼓勵讀者掌握新的主題。
每章末尾的複習題和編程練習題進一步強化了重要的信息,有助於讀者理解和消化那些難以理解的概念。本書採用了友好、易於使用的編排方式,不只適合打算認真學習C語言編程的學生閱讀,也適合那些精通其餘編程語言,但但願更好地掌握C語言這門核心語言的開發人員閱讀。
今日話題
說說你的第一學的第一種編程語言是什麼?讀過哪些異步相關圖書?留言+轉發本活動到朋友圈,小編將抽獎選出1名讀者贈送異步新書一本。留言後,加小編微信louisenanjing 回覆:抽獎 加你進羣抽獎。
延伸推薦
小學生開始學Python,最接近AI的編程語言:安利一波Python書單
長按二維碼,能夠關注咱們喲
天天與你分享IT好文。
在「異步圖書」後臺回覆「關注」,便可免費得到2000門在線視頻課程;推薦朋友關注根據提示獲取贈書連接,免費得異步圖書一本。趕忙來參加哦!
點擊閱讀原文,購買《C Primer Plus(第6版)中文版》