書名: C語言編程魔法書:基于C11標準作者名: 陳軼本章字數: 4290字更新時間: 2019-01-05 01:58:57
前言
為什么要寫這本書
本人在2001年上了大學本科,讀計算機科學與技術專業。在第一年的上半學期,對計算機編程還沒什么感覺。但是就在考“C語言程序設計”這門專業課的前一個月,感覺這門課學了那么久幾乎什么都不會,可把我急壞了。然后就在這短短一個月的時間里又是看書,又是上機實驗,終于考了70多分,算是過關了……不過奇怪的是在考試結束后,就發現自己對編程有了感情。到了大二,我們上“數據結構”所使用的教材是基于C++編程語言的,因為之前沒學過C++語言,所以只能自學。而在這個過程中,我發現自己對編程更加熱愛。在上完大三之后,我在暑假里又把之前的C語言重新鞏固一番。有了計算機組成、操作系統、匯編語言、數據結構等知識積淀之后再去看C語言編程就感覺容易多了。我也是由此喜歡上了C編程語言。
10年之后,發現國內市面上很多C語言參考書仍然顯得非常陳舊。不僅基于古老的C89/90標準,而且還在用Visual C++ 6.0這種既收費又老舊的開發環境教學生。對于比較新的C99標準的講解屈指可數,更鮮有針對最新的C11標準的書籍。出于對C語言的熱愛,在此熱切希望能把最新標準的C語言奉獻給各位讀者,也想把C語言的方方面面講透并且能講得通俗易懂,方便讀者去思考實踐,所以這也是我寫這本書的主要原因。當各位閱讀完本書之后,會發現C語言竟然如此強大!而且在大部分時候,尤其是我們想集中注意力解決某個特定問題的時候,使用C語言要比用其他一些基于面向對象的類C編程語言(比如C++、Java等)要直觀得多!
本書之所以叫“C語言編程魔法書”,是因為像“寶典”、“圣經”之類的詞已經被用濫了。再者,C語言本身就擁有極其強大的魔力,你能用它做幾乎所有的事情。而且幾乎每一個C語言編譯器都能內聯匯編語言,或者與C++、Objective-C直接兼容,而對于像Java、C#、Python等許多編程語言也有相應的接口。所以,我認為C語言在計算機編程語言領域中就好比數學在自然科學中的地位和作用,它是很多編程語言的基礎,而且很多編程語言的編譯器或解釋器也都是基于C語言來寫的。
就在2015年2月,Khronos標準組織發布了最具現代化的圖形API——Vulkan,其主機端接口用的API是純C語言。此外,像OpenGL、OpenCL、OpenAL、OpenVG等開放標準都基于純C語言。此外,最近10年來TIOBE每月的編程語言排名,C語言排名始終能進前兩名,也能說明它的使用范圍之廣,而且許多開源項目也多多少少會使用C語言來編寫。況且學了C語言之后,再學習C++、Java等面向對象編程語言也會輕松很多。尤其像C++和Objective-C,沒有C語言基礎是完全不行的。所以個人十分推薦計算機系的大學生將C語言作為自己的計算機入門編程語言!
本書特色
從技術層面上講,本書介紹了C語言的最新標準,即ISO/IEC 9899:2011。同時,也介紹了主流開源C語言編譯器GCC與Clang對標準C語言語法的擴充。而且所基于的編譯器和開發環境也是比較新的Visual Studio Community 2017、GCC 5,以及Clang 3.8(Apple LLVM 8.0,基于Xcode 8)。
從適合讀者閱讀和掌握知識的結構安排上講,本書分為“預備知識篇”、“基礎語法篇”、“高級語法篇”,以及“語法擴展篇”,還有最后的“項目實踐篇”。從基礎到高級,循序漸進地為讀者描述C語言編程方法。本書尤其著重C語言標準語法上的精確描述,通過許多代碼片段給讀者介紹各種C語言語法知識,并且能反映出C語言的靈活性以及在使用上的約束。
本書推崇讀者使用合法免費的C語言編譯器以及集成開發環境,希望讀者能有正確的軟件版權意識,這樣才能更好地為我國軟件事業增添光彩,為打造良好的應用市場以及生態環境作出貢獻。因此,本書主要選擇使用GCC、Clang這兩個主流開源免費的C語言編譯器,而集成開發環境(IDE)則采用Visual Studio Community、Eclipse、Xcode這三個常用的免費開發工具,其中,Visual Studio Community不是開源的,而Xcode則是部分開源的。
本書雖然會講解整個C編程語言,涉及了幾乎所有的語法點,但是考慮到本書讀者可能是初學C語言,且沒有多少計算機專業知識,所以本書措辭會盡量通俗,而不過于追求學術化。某些描述可能會不太嚴謹,但對于本書所用到的GCC、Clang這兩大主流編譯器而言將完全適用。另外,考慮到不少讀者從事嵌入式系統開發工作,所以對于C語言標準中出現的所謂“由實現定義的”場合會盡量區分情況分別闡明。本書的最終的目的就是讓讀者至少能熟練掌握C語言編程,能將它靈活地運用于實際工程中。
讀者對象
□嵌入式系統開發者
□移動或桌面客戶端應用程序開發者
□服務器端應用程序開發者
□系統架構師
□計算機、電子工程、通信專業的大學生
□其他對C語言編程感興趣的人員
如何閱讀本書
本書一共分為四大篇。
預備知識篇(第1~3章),簡單描述C語言的概況、學習C語言的預備知識,以及在Windows、macOS和Linux三大桌面環境下搭建編寫C環境的方法。
第1章 C魔法概覽。主要介紹C語言的來歷和演化,用它編寫代碼的編程模式以及我們可以用于實踐的主流C語言編譯器。
第2章 學習C語言的預備知識。這一章主要為不太熟悉計算機系統的讀者提供一些基礎的計算機理論知識和相關概念,比如整數與浮點數在計算機中的表示方法、字符編碼格式、按位邏輯計算、移位操作等。
第3章 C語言編程的環境搭建。這一章主要介紹了Windows、macOS以及Linux系統下如何安裝并使用主流編譯器與集成開發環境。
基礎語法篇(第4~11章)講解C語言的基本語法。這是C語言程序員必須掌握的。
第4章 C語言中的基本元素。這一章描述了C語言中常用字符集以及合法token的構成。此外還介紹了標識符、關鍵字以及標點符號的使用說明。
第5章 基本數據類型。這一章介紹了整數類型、字符類型、浮點類型數據的表示,以及它們之間的類型轉換。此外還描述了對于這些基本數據類型的算術邏輯操作、投射操作以及通過sizeof操作符獲取數據類型與對象相應的字節數。
第6章 用戶自定義類型。這一章描述了枚舉、結構體以及聯合體這三種用戶自定義類型,并介紹了它們的特性以及各種使用方式。
第7章 C語言的數組和指針。這一章十分關鍵,也是C語言的語法難點。這里詳細介紹了C語言中一維數組與多維數組的表示以及如何對它們進行操作,然后介紹了C語言中的指針類型,詳細闡述了指針類型的使用技巧以及需要注意的事項。
第8章 C語言的控制流語句。這一章介紹了C語言的條件語句、選擇語句以及循環等控制流語句。
第9章 C語言的函數。這一章介紹了C語言中的函數概念,包括C語言函數的聲明及定義,還有C函數的調用。此外還介紹了C語言函數標識符作為表達式時的類型。
第10章 C語言的預處理器。這章包含了目前C11標準中所支持的所有預處理器特性,包括宏定義、預處理條件、預編譯指示符與操作符以及C代碼的注釋。
第11章 C語言的編譯上下文。這一章介紹了C語言對象與函數的作用域和名字空間。詳細介紹了C語言中的四大作用域以及在不同作用域中的對象的生命周期。此外還介紹了對象與函數的連接屬性,包括外部連接和內部連接。
高級語法篇(第12~16章)講述C語言的一些高級特性。這一部分內容不需要C語言程序員必須掌握,但需要對此有個大概了解。
第12章 C語言中的類型限定符。該章介紹了C11標準中支持的const、volatile、restrict與_Atomic這四種限定符。詳細說明了限定符用于修飾含有指針的對象時,在*號的不同位置所起到的不同作用。然后分別介紹這四種限定符的具體含義。
第13章 C語言中的類型系統。這一章把C語言語法體系中的整個類型系統再梳理了一遍。這一章介紹了對于一些復雜類型的對象如何去剖析、理解,然后自己如何去聲明自己想要的復雜類型的對象和函數。這一章所描述的其實是整個C語言語法體系的核心,如果大家能掌握的話,那么基本就算是真正掌握C語言了。其實,對于任一強類型的編程語言而言,其系統類型總是扮演著十分重要的角色,我們學習此類語言都需要透徹理解其整個類型系統。
第14章 C11標準中的表達式、左值與求值順序。該章先介紹了C11標準中各類表達式以及它們的計算優先級。然后介紹了“左值”這個概念,并講解了表達式之間的求值順序。
第15章 函數調用約定與ABI。該章與C語言標準并無太大關系,但卻與實際項目開發有關。這一章介紹了主流C語言編譯器所采用的函數調用約定,然后詳細描述了函數調用的過程,包括參數傳遞和返回值的具體處理。該章對嵌入式系統開發者以及需要將C語言與匯編語言進行交互使用的高性能計算開發者而言,將大為有用。
第16章 創建動態庫與靜態庫。這一章介紹了用主流C語言編譯工具構建靜態庫以及動態庫的方法,并介紹如何使用這些庫文件。
語法擴展篇(第17~19章)講述了GCC與Clang編譯器對C語言的擴展。
第17章 GCC對C11標準的擴展。該章先簡單介紹GNU語法擴展,然后介紹GCC編譯器中常用的擴展語法。
第18章 Clang編譯器對C11標準的擴展。該章介紹了Clang編譯器對C11標準的語法擴展。最后還介紹了Apple開源的Grand Central Dispatch庫的簡單使用。
第19章 對C語言的未來展望。該章主要介紹了C語言的設計理念以及當前C語言標準委員會的工作組正在為C語言新增的內容,還談到了哪些特性不會被添加到C語言中去。
項目實踐篇(第20~21章),這里通過兩個實際的C語言項目來介紹我們如何利用C語言來創作出自己的程序。
第20章 描述了UTF-8編碼格式的字符串與UTF-16編碼格式的字符串進行相互轉換的例子。
第21章 介紹一個看似簡單而功能很豐富的基于控制臺的計算器程序。
建議零基礎的讀者要了解第一篇的預備知識,這對于后面深入學習C語言編程很有幫助。另外,這部分讀者可以先不用強行看第三篇,尤其是第15章。因為第三篇涉及的知識比較深,而第15章又會直接引入匯編語言,這對于沒有一定計算機專業知識的讀者會比較難以理解。如果是有一定計算機專業知識的讀者可以略過第一篇,直接閱讀第二篇。另外,如果是從事嵌入式系統開發的、或從事系統底層開發的資深程序員,建議仔細閱讀第三、第四篇,相信這部分內容會對你的工作很有幫助。
勘誤和支持
由于筆者的水平有限,編寫時間倉促,書中難免會出現一些錯誤或者不準確的地方,懇請讀者批評指正。如果你有更多的寶貴意見,歡迎你訪問我的個人博客網站http://blog.csdn.net/zenny_chen進行專題討論,我會盡量在線上為你提供最滿意的解答。同時,你也可以通過微博http://weibo.com/zenny1chen與我聯系,或發送電子郵件到zenny_chen@163.com。期待能夠得到你們的真摯反饋,在技術之路上互勉共進。另外,本書最后兩章的代碼可以在作者的GitHub上獲?。?a >https://github.com/zenny-chen。
致謝
首先感謝我的父母和妻子對我寫作此書的大力支持,尤其是我妻子在我忙于工作、編寫此書時幫忙照顧孩子和做飯。然后感謝我公司老板對我寫作此書的鼓舞與期待。
這里還要感謝機械工業出版社華章公司的編輯高婧雅,在一年多的時間里給予我的大力支持和幫助。
最后感謝支持我的技術愛好者,感謝你們對我的支持以及對我的信任。
我想和作者聊聊
為了能更好地與讀者進行聯系,筆者這里留了一個QQ討論群。各位如果在閱讀此書中有任何疑問可以來本群詢問,大家可以一起探討。各位可以掃一掃下方的二維碼,進此群的提示語為:“C語言編程魔法書”,或者查詢群號86540289申請入群。

陳軼
- R語言游戲數據分析與挖掘
- Mastering macOS Programming
- FFmpeg入門詳解:音視頻原理及應用
- 領域驅動設計:軟件核心復雜性應對之道(修訂版)
- Mastering Android Game Development
- R用戶Python學習指南:數據科學方法
- 深入淺出Go語言編程
- Clojure High Performance Programming(Second Edition)
- Continuous Delivery and DevOps:A Quickstart Guide Second Edition
- 快樂編程:青少年思維訓練
- XML程序設計(第二版)
- JavaScript語法簡明手冊
- Learning iOS Penetration Testing
- Python深度學習入門:從零構建CNN和RNN
- Clojure High Performance Programming