权威的C书指南和清单


400

这个问题试图在社区中收集由社区维护的优质图书清单。 针对各种技能水平的编程语言。

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

请提出对已接受答案的修改建议,以添加高质量的书,并附上大致的技能水平,并简要介绍每本书。(请注意,该问题已锁定,因此不会接受新的答案。列表中仅保留一个答案

随意讨论书籍的选择,质量,标题,摘要,技能水平以及您发现不对的任何其他内容。在这里,C社区认为令人满意的书籍将继续出现在清单上;其余的将定期删除。

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

也可以看看:


该问题已在Meta上进行了讨论,作为2018年已删除问题审核的一部分。
共识是不删除它并积极维护它。


31
不要轻视这个很好的问题,但是...大多数人需要花费数年才能掌握K&R。那里比您想象的更多。这本书的薄薄是骗人的。
dmckee ---前主持人小猫

4
如果您不熟悉C,请记住,现代C是ANSI C,早于该标准(1989)的所有内容都可能过时。在90年代中期或之后拍摄。
丹娜·罗宾逊

7
@Dhaivat我认为不是,请小心使用K&R潮流。K&R没有解决好的程序设计或好的编程习惯,主要是因为它最初是在任何人都不知道什么是好的编程习惯之前编写的。它没有提到C语言中哪些部分是多余的,甚至是危险的。该书已正确列为参考手册,不应用于教学/学习现代编程。
伦丁

我同意Dana的观点,在89/90的ANSI / ISO标准化之前未写的任何内容都不会出现在这样的列表中。您还可以考虑说明哪些书籍可以处理C99,哪些不可以。
伦丁

Answers:


492

警告

这是质量各异的随机书籍的清单。在某些人看来(有理由),它不再是推荐书籍的列表。其中列出的一些书包含明显不正确的陈述或教导错误/有害的做法。了解此类书籍的人可以编辑此答案以帮助改进它。请参阅C书籍清单。怎么办呢?,还删除了问题审核2018

参考(所有级别)

  • C编程语言(第二版) -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袖珍参考书(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年第一届爱丁堡; 2020年第二届爱丁堡)。从入门C到高级C,它涵盖5个级别的C(相遇,相识,认知,经验,野心)。涵盖C11和C17,包括线程和原子访问,这是其他书籍所没有的。并非所有的编译器都能在所有环境中识别这些功能。

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

  • The C Puzzle Book-艾伦·弗尔(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实现算法的方法。可能会让您想抛弃所有其他算法书籍,并保留其中的一本。

  • C上的指针 -Kenneth Reek(1997)。

  • C语言中的指针 -Naveen Toppo和Hrishikesh Dewan(2013)。

  • C中的问题解决和程序设计(第6版) -Jeri R. Hanly和Elliot B. Koffman(2009)。

  • 数据结构-使用C的高级方法 -Jeffrey Esakov和Tom Weiss(1989)。

  • C释放 -理查德·希思菲尔德,劳伦斯·柯比等。(2000)。这并不理想,但是值得中级程序员练习本书中编写的问题。这是comp.lang.c贡献者建议的一种类似于菜谱的好方法。

专家

  • 专家C编程:深刻的C秘密 -Peter van der Linden(1994)。Sun编译器团队提供了许多有趣的信息和战争故事,但有些地方过时了。

  • 实例高级C编程 -John W. Perry(1998)。

  • UNIX环境中的高级编程 -Richard W. Stevens和Stephen A. Rago(2013)。关于如何使用C代码中的Unix API的全面描述,但是关于C编码的原理并没有那么多。


未分类

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

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

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

  • 功能性C -Pieter Hartel和Henk Muller(1997)。在考虑并发性和模块化的情况下,讲授对低级编程无价的现代实践。

  • 编程实践 -Brian W. Kernighan和Rob Pike(1999)。与K&R一起阅读的好书。它也使用C ++和Java。

  • C陷阱与陷阱 A. Koenig(1989)。很好,但是C风格早于标准C,这使得这些天不那么受欢迎。

    一些人主张从该清单中删除“陷阱和陷阱”,因为它使某些人陷于犯错。其他人则继续主张将其纳入。也许应该将其视为“专家”书,因为它需要一定程度的C语言方面的知识才能了解自发布以来所发生的变化。

  • 建立自己的Lisp -Daniel Holden(2014)。一种学习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年开始学习ACCU审阅的关于初学者C(116种书名)和从2008 年开始高级C(76种书名)的图书的存档列表。这些书大多数看起来不再是主要网站,您不能按主题浏览无论如何。


警告事项

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

也不要使用Yashwant Kanetkar 的《让我们吧》(2017 年 16 版)。许多人将其视为一本过时的书,该书教授Turbo C,并且包含许多过时,误导和不正确的资料。例如,第137页讨论了预期的输出,printf("%d %d %d\n", a, ++a, a++)并且并未将其分类为未定义的行为

Zed Shaw的《Learn C The Hard Way》(2015年)。一本评论不一的书。 蒂姆·亨特纳尔(Tim Hentenaar)对这本书的评论:

总结一下我提出的观点,作者以一种过于简化和误导的方式介绍了该材料,整个语料是一团糟,他提供的某些观点和分析完全是错误的。我曾经尝试过从新手的角度看这本书,但不幸的是,我因多年使用C语言编写代码的经验而产生偏差。对于我来说,很明显作者要么对C的理解有误,要么他故意过分简化了C。指出他实际上在误导读者的地方(有意或以其他方式)。

“我很难向那些学习编程和学习C的人推荐这本书。”如果您已经是其他一些相关语言的熟练程序员,那么它代表了关于C,尽管我对本书的某些部分有所保留。 乔纳森·莱夫勒


过时的


其他捐助者,在修订历史不一定记,包括:
亚历克斯·洛克伍德本·杰克逊泡沫爪子coledot达纳·罗宾逊丹尼尔·霍顿Dervin咚DWCErci后盖伦haziz约翰Bezem乔纳森·莱弗勒约书亚Partogi卢卡斯伦丁马特K.mossplix马修·米midorNietzche-jouNorman Ramseyr3st0r3ridthyselfRobert S.BarnesSteve SummitTim RingTony BaiVMAtm


6
@PabloBarríaUrenda不适当的内容应该通过标记帖子来解决。不过,“两次单击”是一个愚蠢的声明,因此您的标志可能会被拒绝。关于提及的旗帜是否令人反感的任何辩论也不应该在这里。将此类问题发布在meta.stackoverflow.com上
伦丁

1
“两次单击即可离开”的愚蠢之处是什么?
PabloBarríaUrenda '19

3
在2019年,我发现这本书<Modern C>非常值得一读,它使用了很多c99和c11语法,非常紧凑且编写得很好。你知道吗?免费 !!!您可以在此处以pdf格式下载最新版本:icube-icps.unistra.fr/img_auth.php/d/db/ModernC.pdf(顺便说一句,看来作者正在根据需要在上述链接上更新和出版该书)
Eric Wang

1
我正打算添加一本书,以意识到它被不推荐编辑。也许在帖子中留下那些可见的理由,理由是应该避免使用它。甚至是不推荐书籍的单独部分?
gst

3
我尝试编辑答案失败(显然是由于格式不正确,甚至在我进行编辑之前就弹出了)。无论如何,在这里至少有两本推荐的书被列为“要避免的书”:iso-9899.info/wiki/Main_Page#Stuff_that_should_be_avoided。请删除“构建自己的Lisp”和“努力学习C”,然后将以上链接添加到“ 警告”部分。
gst
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.