# 春节策划二 | 关于 C 语言,我有这些书籍想推荐给你 你好,我是于航。在上一篇加餐里我提到,为了产生学习的“飞轮效应”,我们可以先熟读经典书籍,来完成对某个领域知识的“原始资本积累”。那么,对于 C 语言学习来说,从基础到进阶,都有哪些经典书籍可以参考呢? 今天,我就向你介绍几本值得作为首批阅读材料的 C 语言书籍。这些书里的大部分我都读过不止一遍,希望它们也能对你有所帮助。 **第一本书是 Stephen Prata 的经典著作《C Primer Plus》。** ![图片](https://static001.geekbang.org/resource/image/c1/b1/c12f950eee0c89667625927d76dde1b1.jpeg?wh=650x836) 你可能也对它很熟悉。这本书非常适合没有任何编程语言基础的同学,来作为初次学习 C 语言时的参考书籍。当然,如果你已经具备了一定的 C 语言基础和项目经验,也可以阅读本书来进行适当的查缺补漏。 **这本书详细地介绍了 C 基本语法(最新版,基于 C11 标准)的各类细节**,并通过大量实例,展示了这些语法在实际项目中的使用方式。但稍显遗憾的是,本书对 C 标准库的相关内容仅在附录中做了简短介绍,如果你想了解如何正确使用标准库的相关接口,那它的参考价值就比较有限了。 **第二本书是 Jens Gustedt 的《Modern C》**。 ![图片](https://static001.geekbang.org/resource/image/97/23/973112a60793040a75a69ed4a9587e23.png?wh=1920x2408) 这本书虽然没有上一本经典,但它是为数不多的以 C17 标准为主的 C 语言书籍。这本书采用了不同的角度将相关内容进行了分类,并且还讲解了代码风格、C 内存模型、多线程,以及原子操作等内容,这些都是《C Primer Plus》中没有涉及到的。 唯一美中不足的是,书中的用例相对来说较为复杂,理解成本比较高。但还是推荐你完整阅读一遍,相信读完后你会有不少收获。 **第三本书是 Randal E.Bryant 等人编写的《Computer Systems: A Programmer’s Perspective》,它的中文版书名为《深入理解计算机系统》**。 ![图片](https://static001.geekbang.org/resource/image/2e/5a/2ec793fb536520997c94328955d0e95a.jpeg?wh=800x800) 同样地,这也是一本经典书籍,通常被简称为 “CSAPP”。我认为,这本书是每一个专业的程序员都应该反复阅读,甚至去动手实践的一本书。通过它,**我们能够对计算机系统的内部运作机制有一个基本且全面的认识**。 对于 C 语言开发者来说,掌握基本的语法只是职业生涯中的第一步。如果想触及与 C 语言密切相关的操作系统、编译器、虚拟机、系统编程等众多底层领域,就离不开与计算机系统打交道。因此,这本书可以说是 C 开发者的必读书之一。 **第四本书是 Igor Zhirkov 的《Low-Level Programming》**。 ![图片](https://static001.geekbang.org/resource/image/18/70/18f0c41dyyd53f9d76b4c62843c7b770.jpeg?wh=1000x1429) 这本书可以作为学习 NASM 和 x86-64 的入门教材。NASM 是一个针对 x86 处理器的汇编器,它可以将我们使用纯 x86 汇编代码编写的程序,编译为对应的二进制可执行文件。 本书使用汇编代码与 C 代码,介绍了 x86-64 平台上的系统调用、虚拟内存、非本地跳转、调用约定,以及共享库等内容,信息量非常丰富。不过这本书也有一些不足的地方,比如某些章节的内容可能有些偏题(如 12.2 节介绍的递归下降算法),并且课后习题较为复杂(比如有一节的课后题是使用汇编实现一个 Forth Machine)。 **第五本书是潘爱民等人编写的《程序员的自我修养——链接、装载与库》。** ![图片](https://static001.geekbang.org/resource/image/b1/a6/b103d17279118b5fb20c94dbcbc715a6.png?wh=1073x1281) 这本书可以作为 CSAPP 的后续拓展资料。**该书详细地介绍了程序编译及运行时背后发生的一切细节**,比如目标文件的结构、静态链接与动态链接的区别、Linux 共享库的版本控制,以及 CRT 的组成结构与运行原理等。但稍有遗憾的是,本书的相关内容是基于 IA-32 而非 x86-64 平台介绍的,两者在某些技术细节上可能稍有不同。 **第六本书是 Peter Van Der Linden 的《Expert C Programming: Deep C Secrets》**。 ![图片](https://static001.geekbang.org/resource/image/24/9a/24c76d4daa17b5f89809c200d521399a.png?wh=898x1074) 这本书出版于 1994 年,因此其中的部分内容在如今的 C17 甚至 C2x 标准下,早已过时。但我仍然向你推荐它的一个重要原因是,这本书的作者以诙谐幽默的方式讲述了 C 语言在设计上的种种考量。如果你想知道为什么 C 语法会被如此设计,那么看完这本书,你可能会有新的发现。 **最后一本书是邓志的《x86/x64 体系探索及编程》**。 ![图片](https://static001.geekbang.org/resource/image/95/e3/95ce3f3dfb5d302363e2b80e940411e3.png?wh=888x1254) 从名字上就能看出,这是一本专注于探索 x86/x64 平台处理器架构的书,因此它并非适合所有 C 开发者。如果你对 x86 ISA 指令的原理和使用细节感兴趣,又不想直接阅读英文版的 Intel x86 Manual,那这本书无疑是一个很好的选择。 当然,除了上面推荐的这几本书外,在学习 C 语言的过程中,你也可以参考 [cplusplus.com](https://cplusplus.com) 和 [cppreference.com](https://cppreference.com) 等较为权威的网站,来查询与具体 C 语法或标准库特性使用相关的内容。 “书山有路勤为径,学海无涯苦作舟。”希望本讲的内容能给你一些帮助,让我们一起在终身学习的旅程中继续前进。