权威C书指南和清单

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

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

请建议编辑接受的答案,以添加高质量的书籍,与大致的技能水平和简短的简介/描述每本书。(请注意,问题是锁定的,所以不会接受新的答案。列表中只保留了一个答案)

你可以自由地讨论书的选择、质量、标题、摘要、技巧水平以及任何你认为是错误的东西。C社区认为令人满意的书籍将留在列表中;其余的将被定期移除。

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

参见:


此问题已在Meta上讨论,作为已删除问题审计2018。大家的共识是不删除,积极维护。

558606 次浏览

< >强警告< / >强 !

这是一份质量各异的随机书籍清单。在某些人看来(有一定道理),它不再是一本推荐书目。一些列出的书籍包含明显不正确的陈述或教导错误/有害的做法。了解这类书籍的人可以编辑这个答案,帮助改进它。 参见C语言书单已经乱了套。怎么处理呢?2018年删题审计

参考资料(各级)

  • Brian W. Kernighan和Dennis M. Ritchie(1988)。这仍然是一本很好的、简短而完整的C语言介绍(C90,而不是C99或更高版本),由C语言的发明者编写。然而,在过去的25年里,语言已经发生了变化,良好的C风格已经发展起来,书中的一些部分显示了它的年代。

  • C:参考手册(第五版) - Samuel p . Harbison和Guy R. Steele(2002)。一本优秀的C语言参考书,包括C99。它不是教程,可能不适合初学者。如果你需要为C编写一个编译器,就像作者在开始时必须做的那样,这是很好的。

  • C袖珍参考书(奥莱利) - Peter Prinz和Ulla Kirch-Prinz(2002)。

  • comp.lang.c FAQ - Steve Summit。网站上有许多关于C的问题的答案。

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

  • 新的C标准——注释的参考(免费PDF) -德里克M.琼斯(2009)。“新标准”;指的是旧的C99标准,而不是C11。

  • < p > C99标准的基本原理


初学者

  • C语言编程:现代方法(第二版) - K. N. King(2008)。A good book for学习;

  • C语言编程(第4版) - Stephen Kochan(2014)。一个很好的一般介绍和教程。

  • C入门+(第5版) - Stephen Prata (2004)

  • A Book on C - Al Kelley/Ira Pohl(1998)。

  • C类书籍(免费在线)- Mike Banahan, Declan Brady和Mark Doran(1991)。

  • C:如何编程(第8版) - Paul Deitel和Harvey M. Deitel(2015)。对于初学者来说,有很多好的建议和最佳实践。这个指数非常好,可以作为一个不错的参考(只是不完全全面,而且很肤浅)。

  • David Griffiths和Dawn Griffiths(2012)。

  • 入门C(第五版) Ivor Horton(2013)。非常好的指针解释,使用了很多小而完整的程序。

  • Bradley L. Jones和Peter Aitken(2002)。非常好的介绍性内容。

  • C In Easy Steps(第五版) -麦克格拉斯(2018)。这是一本学习和参考C语言的好书。

  • 有效的C - Robert C Seacord(2020)。这是现代C语言的很好的介绍,包括动态内存分配、程序结构、调试、测试和分析等章节。它有一些指向可能的C2x功能的指针。

中间

  • 现代C - Jens Gustedt(2017第1 Edn;2019年第2版)。涵盖了从初级C到高级C的5个层次(遭遇,相识,认知,经验,抱负)。它涵盖了C11和C17,包括线程和原子访问,这是其他书籍很少做的。并非所有编译器都能在所有环境中识别这些特性。

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

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

  • 标准C库 - pj Plauger(1992)。它包含了C89标准库实现的完整源代码,以及关于设计的广泛讨论,以及为什么要这样设计代码。

  • 21世纪C:来自新学院的小贴士 - Ben klemen(2012)。除了C语言,这本书还解释了gdb、valgrind、autotools和git。关于风格的评论在最后一部分(第6章及以后)。

  • C语言算法 - Robert Sedgewick(1997)。让你真正掌握在c中实现算法,非常清晰和清楚;可能会让你想扔掉其他的算法书,只留下这本。

  • Jeri R. Hanly和Elliot B. Koffman(2009)。

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

  • C的释放 - Richard Heathfield, Lawrence Kirby等人(2000)。不理想,但值得中级程序员练习本书中所写的问题。这是comp.lang.c贡献者建议的一种类似食谱的好方法。

专家

  • 专家C编程:C语言的深层秘密 - Peter van der Linden(1994)。来自Sun编译器团队的许多有趣的信息和战争故事,但在某些地方有点过时。

  • 高级C编程实例约翰w佩里(1998)。

  • Richard W. Stevens和Stephen A. Rago(2013)。全面描述了如何从C代码中使用Unix api,但没有太多关于C编码的机制。


未分类的

  • 基本C(免费PDF) -尼克帕兰特(2003)。请注意,这在几个地方描述了C90语言(如。,在讨论//注释和变量声明放置在代码中的任意点时),所以应该谨慎对待。

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

  • 简而言之 - Peter Prinz和Tony Crawford(2005)。如果你需要C99的参考,这是一本很好的书。

  • 果壳中的C(第二版) - Peter Prinz和Tony Crawford(2016),一本涵盖C11的参考书。

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

  • Brian W. Kernighan和Rob Pike(1999)。一本非常好的书,可以陪伴K&R。它也使用c++和Java。

  • C陷阱与陷阱 by 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规则设计的嵌入式系统中是合适的;这并不适用于任何地方。(例如,编译器通常对符号表之类的东西使用动态内存分配,如果没有动态内存分配,即使不是荒谬的,也会很困难。)

  • accu从2007年初学者的C(116本书)和2008年先进的C(76本书)上评论的书籍的存档列表。其中大部分看起来已经不在主站上了,而且你也不能按主题浏览。


警告

ISO 9899维基中有一份需要注意的书籍和教程列表,它本身并没有正式与ISO或C标准相关联,但包含了关于C标准的信息(尽管它欢呼ISO 9899:2011的发布,并没有提到ISO 9899:2018的发布)。

小心赫伯特Schildt写的书。特别是,你应该远离C:《完整参考》(第4版,2000),在一些圈子里被称为C:完全的废话。

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

用艰难的方式学习(2015)由Zed Shaw。一本评价褒贬不一的书。 对这本书的评论 by Tim henenaar:

总结一下我的观点,如下所述,作者以一种过度简化和误导的方式呈现材料,整个语料库是一团乱麻,他提供的一些观点和分析是完全错误的。我试图以一个新手的视角来看待这本书,但不幸的是,多年用C编写代码的经验让我产生了偏见。对我来说,很明显,要么是作者对C的理解有缺陷,要么是他故意把C简化到实际上误导读者的地步(有意或无意)。

“从困难中学习”;这不是一本我可以推荐给既在学编程又在学C语言的人的书。如果你已经是一个精通其他相关语言的程序员,那么它代表了一个关于C语言的有趣而不寻常的阐述,尽管我对书中的某些部分有保留意见。Jonathan Leffler < em > < / em >


过时的


其他贡献者,不一定要记入修订历史,包括:
亚历克斯·洛克伍德, 本•杰克逊, 泡沫, 爪子, coledot, 达纳·罗宾逊, 丹尼尔·霍尔登, desbest, Dervin铛, dwc, Erci侯, Garen, haziz, 约翰Bezem, Jonathan Leffler, 约书亚Partogi, 卢卡斯, , 马特·K。, mossplix, 马修米。, midor, Nietzche-jou, 诺曼·拉姆齐, r3st0r3, ridthyself, 罗伯特·巴恩斯, smalinux, 史蒂夫峰会, 蒂姆环, 托尼呗, < a href = " https://stackoverflow.com/users/213550/vmatm " > VMAtm < / > < / sub > < / p >