权威的 C 书籍指南和清单

The Definitive C Book Guide and List

提问人: 提问时间:2/19/2009 最后编辑:33 revs, 23 users 20%lillq 更新时间:9/11/2023 访问量:602385

问:

这个问题的答案是社区的努力。编辑现有答案以改进此帖子。它目前不接受新的答案或交互。

本问题试图收集社区维护的关于编程语言的高质量书籍列表,针对各种技能水平。

C 是一种复杂的编程语言,很难通过阅读在线教程随时随地掌握。一本综合性书籍通常是学习语言的最佳方式,找到一本好书是第一步。重要的是要避免写得不好的书,更重要的是,避免包含严重技术错误的书。

请对接受的答案提出编辑建议,以添加高质量的书籍,并附上大致的技能水平和关于每本书的简短简介/描述。(请注意,问题已锁定,因此不会接受任何新答案。该列表维护了一个答案)

随意讨论书籍的选择、质量、标题、摘要、技能水平以及您认为错误的任何其他内容。这里 C 社区认为满意的书籍将留在列表中;其余的将定期删除。

对于有 C 和 C++ 用户协会 (ACCU) 评论的图书,应随书一起添加指向这些评论的链接。

另请参阅:


此问题在 Meta 上作为 2018 年已删除问题审计的一部分进行了讨论。
大家的共识是保持它不被删除并积极维护。

C C++

评论

4赞 Dana Robinson 6/7/2011
如果你是 C 的新手,请记住,现代 C 是 ANSI C,任何早于该标准(1989 年)的东西都可能已经过时了。拍摄 90 年代中期或更晚。
7赞 Lundin 8/12/2011
@Dhaivat我认为不是,请小心加入K&R的行列。K&R没有解决好的程序设计或好的编程实践,主要是因为它最初是在任何人知道什么是好的编程实践之前编写的。它没有提到 C 语言的哪些部分是多余的,甚至是危险的。本书被正确地列为参考手册,它不应用于教授/学习现代编程。

答:

580赞 59 revs, 25 users 43%Jonathan Leffler #1

警告

这是一份质量各异的随机书籍列表。在一些人看来(有一定的理由),它不再是推荐书籍的清单。列出的一些书籍包含公然不正确的陈述或教导错误/有害的做法。了解此类书籍的人可以编辑此答案以帮助改进它。 参见 C 书单已经失控。如何处理它?,并且还删除了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 和 C99。这不是一个教程,可能不适合初学者。如果你需要为 C 编写编译器,那就太好了,就像作者在开始时必须做的那样。

  • C 袖珍参考 (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 年第 1 版;2019 年第 2 版)。涵盖从初级 C 到高级 C 的 5 个级别(相遇、相识、认知、经验、抱负)。它涵盖了 C11 和 C17,包括线程和原子访问,这是其他书籍很少做到的。并非所有编译器都能在所有环境中识别这些功能。

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

  • C 益智书 - Alan R. Feuer (1998)

  • 标准 C 库 - PJ Plauger (1992).它包含 C89 标准库实现的完整源代码,以及有关设计以及代码设计原因的广泛讨论。

  • 21 世纪 C:来自新学校的 C 提示 - Ben Klemens (2012).除了 C 语言之外,本书还介绍了 gdb、valgrind、autotools 和 git。关于风格的评论可以在最后一部分(第 6 章及以后)找到。

  • C 语言中的算法 - Robert Sedgewick (1997).让你真正掌握用 C 语言实现算法,非常清晰明了;可能会让你想扔掉所有其他算法书籍并保留这本。

专家


未分类

  • Essential C (免费 PDF) - Nick Parlante (2003).请注意,这在几个点上描述了 C90 语言(例如,在讨论注释和在代码中的任意点放置变量声明时),因此应谨慎对待它。//

  • C 编程常见问题解答:常见问题 - Steve Summit (1995).这是前面列出的网站的书。它不包括 C99 或更高版本的标准。

  • 简而言之 - 彼得·普林茨和托尼·克劳福德 (2005).如果您需要 C99 的参考,这是一本好书。

  • C 简述(第 2 版)- Peter Prinz 和 Tony Crawford (2016),一本涵盖 C11 的参考书。

  • 功能C - Pieter Hartel和Henk Muller(1997)。教授对低级编程非常宝贵的现代实践,并考虑并发性和模块化。

  • 编程实践 - Brian W. Kernighan 和 Rob Pike (1999).一本非常好的书来陪伴K&R。它也使用 C++ 和 Java。

  • C A. Koenig (1989) 的陷阱和陷阱。非常好,但 C 风格早于标准 C,这使得它现在不太值得推荐。

    一些人主张从这个列表中删除“陷阱和陷阱”,因为它使一些人陷入错误;其他人则继续主张将其包括在内。也许它应该被视为一本“专家”书,因为它需要适度广泛的 C 语言知识才能理解自出版以来发生了什么变化。

  • MISRA-C - 由汽车工业软件可靠性协会发布和维护的行业标准。涵盖 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规则的嵌入式系统中是合适的;它并非无处不在。(例如,编译器通常对符号表之类的东西使用动态内存分配,如果不进行动态内存分配,即使不是荒谬的,也是很困难的。

  • 2007 年初级 C(116 种)和 2008 年高级 C(76 种)的 ACCU 审查书籍的存档列表。其中大多数看起来不再出现在主站点上,无论如何您都无法按主题浏览。


警告

在 ISO 9899 Wiki 上有一个需要谨慎的书籍和教程列表,它本身与 ISO 或 C 标准没有正式关联,但包含有关 C 标准的信息(尽管它对 ISO 9899:2011 的发布表示欢迎,并且没有提到 ISO 9899:2018 的发布)。

警惕赫伯特·希尔德(Herbert Schildt)写的书。特别是,你应该远离 C:完整参考(第 4 版,2000 年),在某些圈子里被称为 C:完全废话。

也不要使用Yashavant Kanetkar的《Let Us C》(第16,2017年)一书。许多人认为它是一本过时的书,教授 Turbo C,并且有很多过时的、误导性的和不正确的材料。例如,第 137 页讨论了预期的输出,但没有将其归类为应有的未定义行为。它还始终如一地促进不可移植和错误的编码实践,例如在 、 在类型的变量中使用 、 存储返回值或使用 on 。printf("%d %d %d\n", a, ++a, a++)gets%[\n]sscanfgetcharcharfflushstdin

学习 C 艰难的方式 (2015) 作者:Zed Shaw。一本褒贬不一的书。蒂姆·亨特纳(Tim Hentenaar)对这本书的评论

总结一下我的观点,作者以一种过于简单和误导的方式呈现材料,整个语料库是一团糟,他提供的一些观点和分析是完全错误的。我试图通过新手的眼光来看待这本书,但不幸的是,我被多年的 C 语言编写代码的经验所偏见。对我来说很明显,要么作者对 C 的理解有缺陷,要么他故意过度简化,以至于他实际上误导了读者(有意或无意)。

“艰难地学习 C”不是一本我可以推荐给既学习编程又学习 C 的人的书。如果你已经是其他相关语言的称职程序员,那么它代表了对 C 语言的一个有趣且不寻常的阐述,尽管我对本书的某些部分有所保留。乔纳森·莱夫勒


过时的


其他贡献者,不一定在修订历史中注明,包括:
Alex LockwoodBen JacksonBubblesclawscoledotDana RobinsonDaniel HoldendesbestDervin ThunkdwcErci HouGarenhazizJohan BezemJonathan LefflerJoshua PartogiLucasLundinMatt K., mossplixMatthieu M., midorNietzche-jouNorman Ramseyr3st0r3ridthyselfRobert S. BarnessmalinuxSteve SummitTim RingTony BaiVMAtm

评论

0赞 Jonathan Leffler 10/1/2021
@LorenzoDonati--Codidact.com — 该列表的随机性比原来的要少得多,但仍然不像预期的那样明确或全面。它被积极维护。书单中还有一些我没有看过的书,我认为有些可疑。它列出了一些关于准标准C的旧书,也许应该删除这些书。
0赞 DoubleOZ 3/10/2022
这是一个项目,对 K 和 R 的 C 编程语言练习提供了清晰且经过测试的解决方案,希望它有所帮助: github.com/double-o-z/TheCProgramming_KandR
0赞 user51462 8/21/2022
感谢您帮助策划此列表@JonathanLeffler。如果可能的话,您能否指出哪些书有待审查,例如在书名前加星号?我正在寻找介绍性文本,因此了解绝对推荐哪些标题会有所帮助。
3赞 Lundin 12/1/2022
@Hari 我们为什么要在列表中添加更多过时的书籍?这已经够糟糕了......任何至少不涵盖 C11 的东西都是有问题的,任何至少不涵盖 C99 的东西都是不适合学习的历史遗迹。
2赞 fu7zed 6/28/2023
Jens Gustedt(中级部分)的 Modern C 链接已断开。这是一个新链接:inria.hal.science/hal-02383654v1/file/ModernC.pdf