【问题标题】:The Definitive C Book Guide and List权威的 C 书籍指南和列表
【发布时间】:2010-10-08 10:02:33
【问题描述】:

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

C 是一种复杂的编程语言,很难通过阅读在线教程在旅途中学习。一本综合性的书往往是学习语言的最好方法,而找到一本好书是第一步。重要的是要避免写得不好的书籍,更重要的是避免包含严重技术错误的书籍。

请对已接受的答案提出修改建议,以添加优质书籍,并附上大致的技能水平和关于每本书的简短介绍/描述。 (请注意,问题已被锁定,因此不会接受新答案。列表中只保留一个答案

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

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

另见:


这个问题在Meta 上作为Deleted Questions Audit 2018 的一部分进行了讨论。
共识是保持它不被删除并积极维护。

【问题讨论】:

  • 不要小看这个问题,这很好,但是......大多数人需要数年时间才能掌握 K&R。里面的东西比你想象的要多。书的薄是骗人的。
  • 如果您是 C 新手,请记住现代 C 是 ANSI C,任何早于该标准 (1989) 的东西都可能已经过时了。为 90 年代中期或更晚拍摄。
  • @Dhaivat 我不这么认为,要小心加入 K&R 的潮流。 K&R 不涉及良好的程序设计或良好的编程实践,主要是因为它最初是在任何人都不知道什么是好的编程实践之前编写的。它没有提到 C 语言的哪些部分是多余的,甚至是危险的。该书被正确列为参考手册,不应用于教授/学习现代编程。
  • 我同意 Dana 的观点,即在 89/90 的 ANSI/ISO 标准化之前编写的任何内容都不应出现在这样的列表中。您也可以考虑说明哪些书涉及 C99,哪些不涉及。

标签: c c c++ c


【解决方案1】:

警告

这是不同质量的随机书籍列表。在某些人看来(有一定道理),它不再是推荐书籍的清单。列出的一些书籍包含明显不正确的陈述或教导错误/有害的做法。了解此类书籍的人可以编辑此答案以帮助改进它。 见The C book list has gone haywire. What to do with it?,也见Deleted question audit 2018

参考(所有级别)


初学者

  • C In Easy Steps (5th Edition) - Mike McGrath (2018)。这是一本学习和参考C语言的好书。

  • Effective C - 罗伯特·C·西科德 (2020)。对现代 C 语言的良好介绍,包括关于动态内存分配、程序结构以及调试、测试和分析的章节。它有一些指向可能的 C2x 功能的指针。

中级

  • Modern C — Jens Gustedt(2017 年第一版;2020 年第二版)。涵盖从初级 C 到高级 C 的 5 个级别(相遇、相识、认知、经验、抱负)的 C。它涵盖了 C11 和 C17,包括线程和原子访问,其他书籍很少这样做。并非所有编译器都能在所有环境中识别这些功能。

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

  • The C Puzzle Book - Alan R. Feuer (1998)

  • The Standard C Library - P.J. 普劳格 (1992)。它包含 C89 标准库实现的完整源代码,以及关于设计的广泛讨论以及代码为何按所示设计的原因。

  • 21st Century C: C Tips from the New School - 本·克莱门斯 (2012)。除了 C 语言,本书还解释了 gdb、valgrind、autotools 和 git。关于风格的 cmets 在最后一部分(第 6 章及以后)中找到。

  • Algorithms in C - 罗伯特·塞奇威克 (1997)。让您真正掌握用 C 实现算法。非常清晰明了;可能会让您想扔掉所有其他算法书籍并保留这本。

专家


未分类

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

  • C Programming FAQs: Frequently Asked Questions - 史蒂夫·萨米特 (1995)。这是前面列出的网站的书。它不包括 C99 或更高版本的标准。

  • C in a Nutshell - 彼得·普林茨和托尼·克劳福德 (2005)。如果您需要 C99 的参考,这本书非常好。

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

  • The Practice of Programming - Brian W. Kernighan 和 Rob Pike (1999)。一本很好的陪伴K&R的书。它也使用 C++ 和 Java。

  • C Traps and Pitfalls 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 年起在 Beginner's C(116 个书名)和自 2008 年起在Advanced C(76 个书名)上的 ACCU 审查书籍的存档列表。其中大部分看起来不再出现在主站点上,您可以无论如何不要按主题浏览。


警告

ISO 9899 Wiki 上有一系列需要谨慎阅读的书籍和教程,它本身与 ISO 或 C 标准没有正式关联,但包含有关 C 标准的信息(尽管它欢呼 ISO 9899 的发布:2011 且未提及 ISO 9899:2018 的发布)。

警惕Herbert Schildt 写的书。特别是,您应该远离 C: The Complete Reference(第 4 版,2000 年),在某些圈子中被称为 C: The Complete Nonsense。

也不要使用 Yashwant Kanetkar 的书 Let Us C(第 16th 版,2017 年)。许多人认为它是一本过时的书,教授 Turbo C,并且有许多过时、误导和不正确的材料。例如,第 137 页讨论了来自 printf("%d %d %d\n", a, ++a, a++) 的预期输出,并没有将其归类为 undefined behaviour。它还不断促进不可移植和错误的编码实践,例如在scanf 中使用gets%[\n]s,将getchar 的返回值存储在char 类型的变量中或在stdin 上使用fflush

Learn C The Hard Way (2015),作者:Zed Shaw。一本褒贬不一的书。 A critique of this book by Tim Hentenaar:

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

“Learn C The Hard Way”不是我可以向既学习编程又学习 C 的人推荐的一本书。如果您已经是其他相关语言的合格程序员,那么它代表了一种有趣且尽管我对本书的某些部分有所保留,但对 C 的不同寻常的阐述。 乔纳森·莱弗勒


过时


其他贡献者,不一定记入修订历史记录,包括:
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 的旧书。
  • @JonathanLeffler 感谢您的反馈。但是,就审核过程而言,我仍然很难理解每个条目的状态。在每个条目旁边添加一个包含该信息的“标签”怎么样?例如。 “2012 年最后一次审查;状态良好”,或“2001 年第一次审查,2015 年最后一次审查;状态有问题/仍然可以”或类似内容。
  • 完全同意 Learn C the Hard Way 的评论。作者只是不喜欢 C,并试图用他的“教学风格”将人们推开。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 2010-11-13
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多