通过这九本开源好书学习 C 语言
我仔细考察了一些我最喜爱的 C 语言书籍，并从其中选出了对我意义最大的九本。
编程 书籍
202.0.86.4
没有code complete?
来自澳大利亚的 Chrome 56.0|Windows 10 用户
2017-03-03T10:38:50.000
114.253.19.244
这里其实只是列出了“开源”的——也就是你不用花钱，当然盗版不在此列。
linux [Chrome 56.0|Mac 10.11]
2017-03-03T21:13:28.000
113.56.202.40
开源的书，质量都不错的！
POCMON [QQ Browser 9.5|Windows 10]
2017-03-04T16:43:05.000
61.133.215.190
BUILS YOUR OWN LISP,这个真的很不错，可惜我没看完就看不懂了。。。
来自宁夏银川的 Chrome 59.0|Windows 7 用户
2017-08-03T12:08:34.000
我仔细考察了一些我最喜爱的 C 语言书籍，并从其中选出了对我意义最大的九本。
书是非常私人的东西，编程类书籍也不例外。我们都是通过阅读书籍来帮助掌握某种语言的基本知识。随后又通过阅读书籍来全面探索这门语言的灵活性。我仔细考察了一些我最喜爱的 C 语言书籍，并从其中选出了对我意义最大的九本。


![](/data/attachment/album/201703/01/120456tz267vsi56w6hd6t.jpg)


C 语言是一种通用的、面向过程的高级编程语言。也是最具流行度和影响力的编程语言之一。该语言在设计时就被设计为可以通过编译器进行编译，以此来对内存进行底层操作、高效地执行机器指令以及在运行时仅需要最小的支持。很多很多编程语言都得益于 C 语言， C 语言就像是编程界的通用语言一样。


C 语言非常易懂。它允许程序员能够以一种清晰、简单、符合逻辑的方式来组织程序。这是一种非常灵活、实用并且简洁的语言，同时它还具有非常容易读懂的语法。使用 C 语言编写的代码运行非常快。可以非常简单地操作计算机的底层设施。通过编译器的指令可以允许我们为不同体系结构的设备生成同一个版本的程序。


C 语言是自由的。因此学习 C 语言的书籍也是体现了其自由性。快来看看我挑选的开源书籍，有没有哪一本能够吸引你？好好享受它吧！


### 《 <ruby> C 语言 <rp>  （ </rp> <rt>  The C Book </rt></ruby>》


![The C Book](/data/attachment/album/201703/01/120757rc0d7zxcccecgxyr.png)


  
《<ruby> <a href="http://publications.gbdirect.co.uk/c_book/">  C 语言 </a> <rt>  The C Book </rt></ruby>》这本书是为那些已经具备使用现代高级面向过程编程语言的程序员设计的。这本书专注于那些 C 语言的特有之处。尤其是使用 C 语言的方式是这本书所重点关注的。作者： Mike Banahan, Declan Brady 和 Mark Doran ，350 页


包含以下章节：


* 变量及运算法则介绍 – 介绍了 C 语言的基础知识, 包括关键字和标识符，变量声明，实数类型，整型，表达式和运算法则以及常量
* 控制流及逻辑表达式 – 这一章介绍了在 C 语言中可以用于控制程序流程的几种方法，包括一些尚未介绍的语句。 控制流，逻辑表达式以及奇怪的运算符。
* 函数 – 函数的类型, 递归，传参数以及链接
* 数组和指针 – 数组, 指针, 字符处理, sizeof 以及储存空间分配, 函数指针，包含指针的表达式，数组，`&`运算符以及函数声明
* 结构体数据类型 – 结构体, 联合体, 位字段, 枚举类型, 限定符、派生类型以及初始化
* 预处理器 – 预处理器是如何工作的及其相关指令
* C 语言中的一些特定内容 – 声明， 定义，`typedef`, `const` 和 `volatile`以及序列点
* 库 – 诊断, 字符处理, 本地化, 与具体实现相关的限制, 数学函数, 非局部跳转, 信号处理, 可变参数, 输入输出, 格式化 I/O, 字符 I/O, 无格式 I/O, 随机访问函数, 通用函数, 字符串处理, 日期和时间
* C 语言编写的完整程序 – 综合以上内容, main函数的参数, 解析程序参数, 模式匹配程序以及一个难度更大的程序


作者允许读者利用此书做任何他们想做的事情，只需说明作者和版权。经 Mike Banahan 确认，本书通过知识共享协议发布。


### 《<ruby> 风格的要素—— C 语言版 <rp>  （ </rp> <rt>  C Elements of Style </rt> <rp>  ） </rp></ruby> 》


![C Elements of Style](/data/attachment/album/201703/01/120757ugl8jikm1s8e1qbs.jpg)


作者 Steve Oualline ，265页


《<ruby> <a href="http://www.oualline.com/books.free/style/index.html">  风格的要素—— C 语言版 </a> <rp>  （ </rp> <rt>  C Elements of Style </rt> <rp>  ） </rp></ruby>》是一本十分有用的编程风格指南，指导 C 和 C++ 程序员如何去编写可读性良好的，易懂的，易于维护的程序。不论你是一个学生还是专业程序员，你都能从这本书中提供的技巧和技术中获益，构建优雅可靠的代码。


这本书意在向读者们展示如何在你的程序中融入风格良好的代码。机器仅处理代码，而人类关注于注释。良好的编程风格与这两部分都有关。


我们的最终目标是构建设计良好，编写良好的代码，这种代码对于计算机来说是高效的，同时包含了精心编写的注释用于帮助人类理解程序。这样一来，调试，维护和增强程序，都变得更加容易了。最终还提升了代码的可读性，简洁性，可靠性和可维护性。


在本书中，你可以找到有关编写注释，程序头，变量命名，语句格式化，语句细节，编写预处理器命令，组织目录和创建makefile的指南。


本书通过知识共享协议发布。


### 《<ruby> 编写你自己的 Lisp 语言 <rp>  （ </rp> <rt>  Build Your Own Lisp </rt> <rp>  ） </rp></ruby>》


![Build Your Own Lisp](/data/attachment/album/201703/01/120758nyoj1gwfo18w8j8m.jpg)


作者 Daniel Holden ，212页


在学习 C 语言的同时学习如何创造你自己的编程语言——一个最简的 Lisp 语言（仅用不到1000行代码）。


《<ruby> <a href="http://buildyourownlisp.com/">  编写你自己的 Lisp 语言 </a> <rp>  （ </rp> <rt>  Build Your Own Lisp </rt> <rp>  ） </rp></ruby>》这本书是为两种人写的，一种是想要学习 C 语言的人，另一种是想要知道如何创建一门语言的人。本书并不适合作为第一本入门书籍，因为你需要一些编程经验才能读懂它的内容。


本书基于[知识共享署名-非商业性使用-3.0 未本地化版本](https://creativecommons.org/licenses/by-nc/3.0/)协议发布


纸质版可以在 Amazon 上购买。


### 《<ruby> GNU C 语言参考手册 <rp>  （ </rp> <rt>  The GNU C Reference Manual </rt> <rp>  ） </rp></ruby>》


![The GNU C Reference Manual](/data/attachment/album/201703/01/120758ftil8ik66td936ot.png)


作者 Trevis Rothwell, James Youngman ，91页


《<ruby> <a href="https://www.gnu.org/software/gnu-c-manual/">  GNU C 语言参考手册 </a> <rp>  （ </rp> <rt>  The GNU C Reference Manual </rt> <rp>  ） </rp></ruby>》是一本 C 语言参考手册，意在写明 C89，C99 标准以及当前 GNU 对标准 C 语言的扩展情况。本书并不适合新手阅读。


包含以下章节：


* 词法元素——这部分内容描述了预编译之后，组成 C 语言代码的词法元素。包括 5 种：关键字，标识符，常量，操作符和分隔符
* 数据类型——研究基础的数据类型，枚举，联合体，结构体，数组，指针，不完全类型，类型修饰词，储存类型修饰词以及重命名类型
* 表达式和操作符 —— 还介绍了自增/自减，算数操作符，复共轭性，比较操作符，逻辑运算符，位移，位运算符，指针运算符，`sizeof`，类型转换等等。
* 语句 —— 标签，表达式，`if` 语句，`switch` 语句，`while` 语句，`do` 语句，`for` 语句，代码块，`null` 语句，`goto` 语句，`break` 语句，`continue` 语句，`return` 语句以及 `typedef` 语句
* 函数 —— 学习函数声明，函数定义，函数调用，参数，变长参数列表，通过指针调用函数，`main` 函数，递归函数等等。
* 程序结构和定义域 —— 从宏观上来看程序
* 一个例程 —— 一个用 C 语言编写的完整程序，包含 C 语言源文件和头文件。这个程序是一个典型“hello world”程序的扩展版，它向我们展示了在 GNU FSF 项目中 C 语言是如何工作的。


本书基于 GNU Free Documentation License Version 1.3 及其更新版本发布。


### 《<ruby> GNU C 语言编程教程 <rp>  （ </rp> <rt>  The GNU C Programming Tutorial </rt> <rp>  ） </rp></ruby>》


![The GNU C Programming Tutorial](/data/attachment/album/201703/01/120742q9ifofxxgip68106.jpg)


作者 Mark Burgess, Ron Hale-Evans ，290页


《<ruby> <a href="http://www.crasseux.com/books/ctut.pdf">  GNU C 语言编程教程 </a> <rp>  （ </rp> <rt>  The GNU C Programming Tutorial </rt> <rp>  ） </rp></ruby>》以逻辑顺序向读者介绍了 C 语言的基本内容。本书内容涵盖了 C 语言的全部主要内容的细节以及如何使用 C 语言编程，特别强调了GNU/Linux编译器以及相关软件。


一些章节主要介绍了函数，变量以及声明，作用域，表达式和操作符，参数，指针，判定，循环，数组，字符串，输入输出等等。


本书基于 GNU Free Documentation License Version 1.1 版发布。


### 《<ruby> C 语言基础 <rp>  （ </rp> <rt>  Essential C </rt> <rp>  ） </rp></ruby>》


![Essential C](/data/attachment/album/201703/01/120758bw7ojh2m0kmxwplz.png)


作者 Nick Parlante ，45页


《<ruby> <a href="http://cslibrary.stanford.edu/101/EssentialC.pdf">  C 语言基础 </a> <rp>  （ </rp> <rt>  Essential C </rt> <rp>  ） </rp></ruby>》这份简短的文档解释了 C 语言全部的常用特性和技术。这份文档十分简洁，因此它的目标人群是已经具有其他编程语言背景的人。


内容包括变量，整型，浮点型，类型提升，截断，操作符，控制结构（`if`,`while`,`for`），函数，数值参数，引用参数，结构体，指针，数组，预处理器以及 C 语言标准库函数。


目录：


* 简介
* 基础类型与运算符
* 控制结构
* 复杂数据类型
* 函数
* 杂项
* 高级数组与指针
* 运算符和标准库


根据作者的描述，我们得知这是一本基于开源协议发布的书籍。


### 《<ruby> Beej 的 C 语言教程 <rp>  （ </rp> <rt>  Beej’s Guide to C Programming </rt> <rp>  ） </rp></ruby>》


![Beej’s Guide to C Programming](/data/attachment/album/201703/01/120758y3dki32tjew3teru.png)


作者 Brian “Beej” Hall ，130 pages


  
《<ruby> <a href="http://beej.us/guide/bgc/">  Beej 的 C 语言教程 </a> <rt>  Beej’s Guide to C Programming </rt></ruby>》试图为那些心存困惑的读者带来一种仅能通过纯粹 C 语言编程而产生的快感。


章节：


* 构建程序的基本结构块
* 变量，表达式和，语句。变量就是一个数字的名字——一个 C 语言表达式可以包含其他的表达式以及运算符。文章还介绍了`if`，`while`，`do while`以及程序重复执行的`for`语句。


* 函数——当程序块变得很大，或是当这些程序块用来执行一些特定的工作时，我们会把它们封装到函数中。
* 变量（续篇）——探讨了变量的作用域和储存类型
* 指针——它们是数据在内存中的地址。就像一个整型的值可以是12，一个指针的值就是数据在内存中的地址
* 结构体——结构体允许你将逻辑上相关的变量分组。随后你可以将其作为一个整体来使用。
* 数组——一组相关数据的线性集合
* 字符串—— C 语言中的字符串就是内存中的一组连续的比特，包含了一组字符
* 动态内存——探讨了malloc(), free(), realloc() 和 calloc() 函数
* 更多内容——指针运算，`typedef`，枚举，结构体声明，命令行参数，多维数组，类型转换和类型提升，不完整类型，`void`指针，`NULL`指针和`static`关键字
* 标准输入输出库——用来进行文件的读写。
* 字符串操作——用来查找子串的函数，连接字符串的函数，获取字符串长度的函数，等等。
* 算数——一些可以满足你基本算数需求的函数。


本书基于[知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本](https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh)协议发布。


### 《<ruby> 现代 C 语言 <rp>  （ </rp> <rt>  Modern C </rt> <rp>  ） </rp></ruby>》


![Modern C](/data/attachment/album/201703/01/120759w2622izindj4onjc.png)


作者 Jens Gustedt ，310页


《<ruby> <a href="http://icube-icps.unistra.fr/img_auth.php/d/db/ModernC.pdf">  现代 C 语言 </a> <rp>  （ </rp> <rt>  Modern C </rt> <rp>  ） </rp></ruby>》鼓励读者逐级探索 C 语言的特性。内容一共分为如下五层境界：


* 第一层——使读者了解最基本的 C 语言程序。了解使用 C 语言的目的和数据结构，以及如何去使用它们
* 第二层——详细的说明了大部分主要概念以及特性，包括控制结构，数据类型操作符和函数。这一级的主要目的是让读者能够对于这些运行程序必备的知识，有更深刻的理解。
* 第三层——进入 C 语言的核心部分。详细的解释了指针，让你熟悉 C 语言的内存模型，并且让你了解大多数 C 语言库的接口
* 第四层——深入理解一些特定的主题。比如性能，重入，原子性，线程及泛型编程
* 第五层——探讨了作者对这门语言未来发展趋势的理解


本书基于[知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本](https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh)协议发布


### 《<ruby> <a href="http://www.network-theory.co.uk/docs/gccintro/">  GCC 简介 </a> <rp>  （ </rp> <rt>  An Introduction to GCC </rt> <rp>  ） </rp></ruby>》


![An Introduction to GCC](/data/attachment/album/201703/01/120759q88gagz5f1rh71sa.png)


作者 Brian Gough ，144页


《<ruby> <a href="http://www.network-theory.co.uk/docs/gccintro/">  GCC 简介 </a> <rp>  （ </rp> <rt>  An Introduction to GCC </rt> <rp>  ） </rp></ruby>》介绍了 GNU C 语言和 C++编译器——gcc 和 g++，它们是 GNU 编译器套装（GCC）的一部分。


本书介绍了如何使用编译器。通过多年以来对邮件列表中的问题的观察，本书带领读者直击 GCC 的重要内容。


章节介绍：


* 编译c程序——介绍了如何使用 gcc 来编译 C 语言程序。单个文件或多个文件均可以编译，也可以使用操作系统函数和头文件。
* 编译选项——介绍了 gcc 中一些常用的编译选项。这些参数控制一些功能，例如搜索库函数和头文件的路径，提供额外的编译告警和诊断。预处理宏和 C 语言方言。
* 使用预处理器——描述了cpp（GNU C preprocessor）的使用方法，cpp 是 GCC 的一部分。预处理器会在编译前将代码中的宏展开，当 GCC 处理 c 或者 c++ 代码时，预处理器会自动被调用。
* 编译带有调试信息的程序——提供了一个`-g`选项用以在中间文件和可执行文件中存储额外的调试信息。这些调试信息使得我们可以追踪错误，将机器指令中的问题定位到源代码中。
* 优化编译——GCC 是一个优化过的编译器。它提供了很多选项，可以加速编译或是减少编译后文件的体积。
* 编译C++程序——介绍了如何使用 GCC 编译 C++ 程序以及该语言可以使用的命令行选项。
* 平台相关选项——介绍了一些常见平台可以使用的选项
* 排错——GCC提供了一些帮助和诊断选项用于帮助我们定位编译过程中出现的问题。
* 编译器相关工具——介绍了 GCC 编译过程中会用到的一些有用的工具。包括用来创建库的 GNU 归档工具 ar，GNU 性能和覆盖率测试程序 gprof 和 gcov
* 编译器是如何工作的——详细介绍了 GCC 是如何把源文件编译为可执行文件的。编译是一个多阶段过程，涉及很多工具，包括 GNU 编译器本身，GNU 汇编器，以及 GNU 链接器。在编译过程中使用的各种工具，我们统称为编译链。
* 检查编译后的文件——介绍了一些用来检查可执行文件和 obj 文件内容的工具。
* 常见错误信息——介绍了 gcc 和 g++ 产生的最常见的错误和告警信息。每种情况都带有原因分析，样例以及建议的解决办法。
* 获取帮助——如果读者遇到了书中没有提到的问题，还有很多介绍GCC和语言的手册可以参考。


本书基于 GNU Free Documentation 协议发布




---


很多 C 语言书籍都可以免费下载，但是可惜的是它们并没有以开源协议来发布，或其基于何种协议并没有明确说明。以下对其进行介绍，排名不分先后：


* 《<ruby> <a href="http://www.tti.unipa.it/~ricrizzo/KS/Data/RMiles/contents.html">  C编程导论 </a> <rp>  （ </rp> <rt>  Introduction to C Programming </rt> <rp>  ） </rp></ruby>》 – 作者 Rob Miles
* 《<ruby> <a href="http://www.coding-guidelines.com/cbook/cbook1_2.pdf">  新标准 C 语言 </a> <rp>  （ </rp> <rt>  The New Standard C: An Economic and Cultural Commentary </rt> <rp>  ） </rp></ruby>》– 作者 Derek M. Jones
* 《<ruby> <a href="http://www.cs.rit.edu/~ats/books/ooc.pdf">  使用标准 C 语言进行面向对象编程 </a> <rp>  （ </rp> <rt>  Object-Oriented Programming with ANSI-C </rt> <rp>  ） </rp></ruby>》– 作者 Axel-Tobias Schreiner
* 《<ruby> <a href="http://www.duckware.com/bugfreec/index.html">  编写零缺陷的 C 语言代码 </a> <rp>  （ </rp> <rt>  Writing Bug-Free C Code </rt> <rp>  ） </rp></ruby>》– 作者 Jerry Jongenius


最后，如果你想买一本权威参考书，请认准《<ruby> <a href="https://www.amazon.cn/gp/product/B0011425T8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;camp=536&amp;creative=3200&amp;creativeASIN=B0011425T8&amp;linkCode=as2&amp;tag=vastwork-23">  C 程序设计语言 </a> <rp>  （ </rp> <rt>  The C Programming Language </rt> <rp>  ） </rp></ruby>》。这本书非常简练，不适合新手，但是被奉为经典。

