《C语言经典书单指南》

400
这个问题试图收集一个社区维护的关于编程语言的优质书籍列表,针对不同的技能水平。
C是一种复杂的编程语言,通过在线教程很难快速掌握。全面的书籍通常是学习该语言的最佳途径,而找到一本好书是第一步。避免糟糕的书籍非常重要,更重要的是避免包含严重技术错误的书籍。
请建议编辑已接受的答案以添加优质书籍,附加近似的技能水平和每本书的简短介绍/描述。(请注意,该问题已被锁定,因此不会接受新答案。单个答案将维护列表)
欢迎就书籍选择、质量、标题、摘要、技能水平以及任何您认为不正确的内容进行辩论。在这里由C社区认为令人满意的书籍将留在列表中;其余书籍将定期删除。
对于有协会C和C++用户(ACCU)评论的书籍,应添加指向这些评论的链接。
另请参见:
这个问题在Meta上被讨论,作为2018年删除问题审计的一部分。
共识是保留它并积极维护。

4
如果您是C语言的新手,请记住现代C语言是ANSI C,任何比该标准(1989年)更早的内容可能已经过时。目标是使用中期90年代或更晚版本的内容。 - Dana Robinson
7
@Dhaivat 我认为不是这样的,请注意不要盲目追随K&R。K&R并没有涉及到良好程序设计和良好编程实践,主要是因为它最初是在人们还不知道什么是良好编程实践之前编写的。它没有提到哪些部分的C语言是多余的甚至是危险的。这本书被正确地列为参考手册,不应用于教授或学习现代编程。 - Lundin
1个回答

578

警告

这是一个质量参差不齐的随机书籍列表。在一些人(有些情有可原)看来,它已不再是一个推荐书籍的列表。其中一些书籍中包含明显错误的陈述或教授错误/有害的做法。了解此类书籍的人可以编辑此答案以帮助改进它。 请参阅The C book list has gone haywire. What to do with it?,以及Deleted question audit 2018

参考资料(所有级别)

  • C语言程序设计(第2版) - Brian W. Kernighan和Dennis M. Ritchie(1988年)。这本书是C语言的发明者所写的,是一本简洁但完整的C语言介绍(C90版本,不包括C99或之后的版本)。然而,语言已经发生了变化,过去25年中也出现了很多好的C语言编程风格,这本书的一些部分已经显得有些过时。

  • C语言参考手册(第5版) - Samuel P. Harbison和Guy R. Steele(2002年)。这是一本关于C语言的优秀参考书,包括C99版本在内。它不是一本教程,对于初学者可能不太适合。如果你需要编写一个C语言编译器,这本书非常有用,因为作者在开始时也是这样做的。

  • C Pocket参考手册(O'Reilly) - Peter Prinz和Ulla Kirch-Prinz(2002年)。

  • comp.lang.c常见问题解答 - Steve Summit。这个网站提供了关于C语言的许多问题的答案。

  • 可以在这里找到各种版本的C语言标准。草案C11标准有在线版本。

  • 新的C语言标准 - 注释参考(免费PDF) - Derek M. Jones(2009年)。所谓的“新标准”指的是旧的C99标准而不是C11。

  • C99标准的理论基础


初学者

中级

  • 现代C语言 — Jens Gustedt (2017年第一版; 2019年第二版)。从初级C到高级C,分为5个层次(初识、熟悉、认知、经验、抱负)。涵盖了C11和C17,包括线程和原子访问等其他书籍很少涉及的特性。并非所有编译器在所有环境中都能识别这些特性。

  • C接口与实现 - David R. Hanson (1997年)。提供了如何以通用和可重用的方式定义C中接口和实现之间的边界的信息。它还通过将这个原则应用于C中常见机制和数据结构的实现(如列表、集合、异常、字符串操作、内存分配器等)来演示这个原则。基本上,Hanson将他在构建Iconlcc时编写的所有代码提取出来,以其他人可以重用于自己的项目的形式呈现。它是使用现代设计技术(包括Liskov的数据抽象)的良好C编程模型,展示了如何将一个大型C项目组织为一组有用的库。

  • C谜题书 - Alan R. Feuer (1998年)

  • 标准C库 - P.J. Plauger (1992年)。它包含了C89标准库的完整源代码,以及对设计的广泛讨论和代码设计的原因。

  • 21世纪C语言:新学派的C技巧 - Ben Klemens (2012年)。除了C语言,本书还解释了gdb、valgrind、autotools和git。关于风格的评论在最后一部分(第6章及以后)。

  • C语言中的算法 - Robert Sedgewick (1997年)。让您真正掌握在C中实现算法的能力。非常清晰易懂;可能会让您想要放弃其他所有的算法书籍,只保留这一本。

  • 使用ANSI-C进行面向对象编程(免费PDF)- Axel-Tobias Schreiner(1993年)。 代码变得有点复杂。如果你想用C++,就用C++吧。它只使用C90,当然。

专家


未分类
  • Essential C(免费PDF)- Nick Parlante(2003年)。请注意,该书在多个地方描述了C90语言(例如,在讨论//注释和变量声明在代码中的任意位置时),因此应该谨慎对待。

  • C Programming FAQs: Frequently Asked Questions - Steve Summit(1995年)。这是之前列出的网站的书籍。它不涵盖C99或后来的标准。

  • C in a Nutshell - Peter Prinz和Tony Crawford(2005年)。如果您需要C99的参考书,这是一本很好的书。

  • C in a Nutshell(第二版) - Peter Prinz和Tony Crawford(2016年),一本涵盖C11的参考书。

  • Functional C - Pieter Hartel和Henk Muller(1997年)。教授低级编程中非常有价值的现代实践,注重并发性和模块化。

  • The Practice of Programming - Brian W. Kernighan和Rob Pike(1999年)。这是一本非常好的与K&R配套的书籍。它还使用了C++和Java。

  • C 陷阱与误区 by A. Koenig (1989)。非常好,但是C语言的风格早于标准C,这使得它在如今不太推荐。

    有人主张从这个列表中删除'陷阱与误区',因为它使一些人陷入了错误;其他人则继续主张将其包含在内。也许应该将它视为一本'专家'书籍,因为它需要对C语言有相当广泛的了解,才能理解自从它出版以来发生了什么变化。

  • MISRA-C - 行业标准,由Motor Industry Software Reliability Association发布和维护。涵盖C89和C99。

    虽然这不是一本书,但许多程序员推荐尽可能多地阅读和实施它。MISRA-C最初是为安全关键应用程序制定的准则,但适用于任何需要稳定、无错误C代码的应用领域(谁不想要更少的错误呢?)。MISRA-C正在成为整个嵌入式行业的事实标准,甚至在其他编程领域也越来越受欢迎。标准有(至少)三个版本(1998年、2004年和2012年的当前版本)。还有一份2016年的MISRA合规指南文件,以及MISRA C:2012修正案1 - MISRA C:2012的附加安全指南(于2016年4月发布)。

    请注意,MISRA规则中的某些限制并不适用于每个上下文。例如,指令4.12规定“不得使用动态内存分配”。这在MISRA规则所设计的嵌入式系统中是合适的,但并非适用于所有情况。(例如,编译器通常使用动态内存分配来处理符号表,如果不使用动态内存分配将会很困难,甚至荒谬。)

  • 存档的ACCU评论书籍列表,包括初学者的C(116本书)(2007年)和高级C(76本书)(2008年)。其中大部分似乎已经不在主站上了,而且你也无法按主题浏览。


警告

ISO 9899 Wiki上有一份需要小心的书籍和教程清单,该网站本身并非正式与ISO或C标准相关联,但包含了关于C标准的信息(尽管它赞扬了ISO 9899:2011的发布,但没有提及ISO 9899:2018的发布)。

要小心Herbert Schildt所写的书籍。特别是要远离C: The Complete Reference(第4版,2000年),在某些圈子中被称为C: The Complete Nonsense。

同时,请不要使用Yashavant Kanetkar的《Let Us C》(第16版,2017年)这本书。很多人认为这本书已经过时了,它教授的是Turbo C,并且包含了很多过时、误导和错误的内容。例如,第137页讨论了printf("%d %d %d\n", a, ++a, a++)的预期输出,并没有将其归类为未定义行为,而实际上应该是这样的。它还一直推广不可移植和有错误的编码实践,比如使用gets,在scanf中使用%[\n]s,将getchar的返回值存储在char类型的变量中,或者在stdin上使用fflush
《学习C语言的艰难之路》(2015年)是由Zed Shaw所著的一本书,评价褒贬不一。
Tim Hentenaar在《对这本书的批评》中写道:
总结一下我的观点,作者以一种过于简化和误导性的方式呈现了材料,整个内容混乱不堪,他提出的一些观点和分析实际上是错误的。我试图从一个初学者的角度来看待这本书,但不幸的是,我被多年在C语言编写代码的经验所影响。对我来说,很明显作者对C语言的理解存在缺陷,或者他故意过于简化以至于误导读者(无论是有意还是无意)。
《学习C语言的艰难之路》不是一本我能够推荐给那些既在学习编程又在学习C语言的人的书。如果你已经是其他相关语言的熟练程序员,那么它代表了对C语言的有趣而独特的阐述,尽管我对书中的部分内容有所保留。——Jonathan Leffler

过时


其他贡献者,不一定在修订历史中得到认可,包括: Alex Lockwood, Ben Jackson, Bubbles, claws, coledot, Dana Robinson, Daniel Holden, desbest, Dervin Thunk, dwc, Erci Hou, Garen, haziz, Johan Bezem, Jonathan Leffler, Joshua Partogi, Lucas, Lundin, Matt K., mossplix, Matthieu M., midor, Nietzche-jou, Norman Ramsey, r3st0r3, ridthyself, Robert S. Barnes, smalinux, Steve Summit, Tim Ring, Tony Bai, VMAtm

@LorenzoDonati--Codidact.com — 这个列表比起最初的版本来说已经不那么随意了,但仍然不够明确和全面。它正在积极维护中。列表中仍有一些我没有审查过但认为有些可疑的书籍。它列出了一些关于预标准C的旧书,可能应该被删除。 - Jonathan Leffler
这里有一个项目,其中包含了K和R的《C程序设计语言》练习题的清晰且经过测试的解决方案,希望能对您有所帮助: https://github.com/double-o-z/TheCProgramming_KandR - DoubleOZ
感谢 @JonathanLeffler 帮助策划这个列表。如果可能的话,您能否在书名前标注待审核的书籍,例如在标题前加上星号吗?我正在寻找一本入门教材,因此知道哪些书籍是绝对推荐的会很有帮助。 - user51462
3
@Hari 为什么我们要将更多过时的书籍添加到列表中呢?现在已经够糟糕了...任何不至少涵盖C11的内容都是值得怀疑的,任何不至少涵盖C99的内容都是历史遗迹,不适合学习。 - Lundin
2
Modern C by Jens Gustedt(中级部分)的链接已失效。 这是一个新的链接:https://inria.hal.science/hal-02383654v1/file/ModernC.pdf - fu7zed
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接