这个问题的答案是community effort .编辑现有答案以改进这篇文章。它目前不接受新的答案或互动。
这个问题试图收集一个社区维护的列表 质量 书上c编程语言,针对不同的技能水平。
C 是一种复杂的编程语言,很难通过阅读在线教程随时随地掌握。一本综合性的书往往是学习语言的最佳途径,而找到一本好书是第一步。避免写得不好的书很重要,更重要的是避免包含严重技术错误的书。
请建议对已接受的答案进行编辑以添加优质书籍,并附上大致的技能水平和关于每本书的简短介绍/描述。 (请注意,问题已锁定,因此不会接受新答案。列表中保留一个答案)
随意辩论书籍选择、质量、标题、摘要、技能水平以及您认为错误的任何其他内容。此处 C 社区认为令人满意的书籍将留在列表中;其余的将被定期删除。
对于有 C 和 C++ 用户协会 (ACCU) 评论的书籍,应随书添加指向这些评论的链接。
也可以看看:
c 中的其他 C 相关资源tag wiki
c++ 的类似列表:The Definitive C++ Book Guide and List
此问题已在
Meta 上讨论过作为
Deleted Questions Audit 2018 的一部分. 共识是保持它不被删除并积极维护。
警告 !
这是一份不同质量的随机书籍 list 。在某些人看来(有一定道理),不再是推荐书单。一些列出的书籍包含明显不正确的陈述或教导错误/有害的做法。知道此类书籍的人可以编辑此答案以帮助改进它。
见 The C book list has gone haywire. What to do with it? ,还有 Deleted question audit 2018 .
引用(所有级别)
The C Programming Language (2nd Edition) - Brian W. Kernighan 和 Dennis M. Ritchie (1988)。仍然是 C 的发明者编写的很好、简短但完整的 C 介绍(C90,而不是 C99 或更高版本)。但是,在过去的 25 年中,语言发生了变化,并且形成了良好的 C 风格,并且有部分显示其年代的书。
C: A Reference Manual (5th Edition) - Samuel P. Harbison 和 Guy R. Steele (2002)。一本关于 C 的优秀引用书,直到并包括 C99。这不是教程,可能不适合初学者。如果您需要为 C 编写编译器,那就太好了,因为作者在开始时必须这样做。
C Pocket Reference (O'Reilly) - Peter Prinz 和 Ulla Kirch-Prinz (2002)。
The comp.lang.c FAQ - 史蒂夫峰会。提供有关 C 的许多问题的答案的网站。
可以找到各种版本的 C 语言标准 here .有draft C11 standard的在线版本.
The new C standard - an annotated reference (免费 PDF) - 德里克 M. 琼斯(2009 年)。所指的“新标准”是旧的 C99 标准而不是 C11。
Rationale for C99 Standard .
初学者
C Programming: A Modern Approach (2nd Edition) - K. N. 金 (2008)。一本学习C的好书。
Programming in C (4th Edition) - 斯蒂芬·科昌 (2014)。一个很好的一般介绍和教程。
C Primer Plus (5th Edition) - 斯蒂芬普拉塔 (2004)
A Book on C - 艾尔凯利/艾拉波尔 (1998)。
The C Book (免费在线)- Mike Banahan、Declan Brady 和 Mark Doran (1991)。
C: How to Program (8th Edition) - Paul Deitel 和 Harvey M. Deitel (2015)。许多适合初学者的好技巧和最佳实践。该索引非常好,可以作为一个不错的引用(只是不够全面,而且非常浅)。
Head First C - 大卫格里菲斯和黎明格里菲斯 (2012)。
Beginning C (5th Edition) - 艾弗霍顿 (2013)。非常好的指针解释,使用了许多小而完整的程序。
Sams Teach Yourself C in 21 Days - Bradley L. Jones 和 Peter Aitken (2002)。很好的入门资料。
C In Easy Steps (5th Edition) - 迈克·麦格拉思 (2018)。这是一本学习和引用C的好书。
Effective C - 罗伯特·C·西科德 (2020)。对现代 C 的很好的介绍,包括关于动态内存分配、程序结构以及调试、测试和分析的章节。它有一些指向可能的 C2x 功能的指针。
中间的
Modern C — Jens Gustedt(2017 年第 1 版;2020 年第 2 版)。涵盖了从初级到高级C的5个级别(相遇、相识、认知、经验、志向)的C。它涵盖了C11和C17,包括线程和原子访问,其他书籍很少这样做。并非所有编译器都能在所有环境中识别这些功能。
C Interfaces and Implementations - 大卫 R. 汉森 (1997)。提供有关如何以通用和可重用的方式在 C 中定义接口(interface)和实现之间的边界的信息。它还通过将其应用于 C 中常见机制和数据结构的实现来演示此原则,例如列表、集合、异常、字符串操作、内存分配器等。基本上,Hanson 将他编写的所有代码作为构建 Icon 的一部分。和 lcc并以其他人可以在他们自己的项目中重复使用的形式提取出最好的部分。它是使用现代设计技术(包括 Liskov 的数据抽象)的良好 C 编程模型,展示了如何将大型 C 项目组织为一堆有用的库。
The C Puzzle Book - Alan R. Feuer (1998)
The Standard C Library - P.J. Plauger (1992)。它包含 C89 标准库实现的完整源代码,以及有关设计和代码设计原因的广泛讨论。
21st Century C: C Tips from the New School - 本克莱门斯 (2012)。除了 C 语言,本书还解释了 gdb、valgrind、autotools 和 git。关于风格的评论见最后一部分(第 6 章及以后)。
Algorithms in C - 罗伯特·塞奇威克 (1997)。让您真正掌握用 C 语言实现算法。非常清晰明了;可能会让您想扔掉所有其他算法书籍并保留这本。
Pointers on C - 肯尼斯·里克 (1997)。
Problem Solving and Program Design in C (6th Edition) - Jeri R. Hanly 和 Elliot B. Koffman (2009)。
Data Structures - An Advanced Approach Using C - Jeffrey Esakov 和 Tom Weiss (1989)。
C Unleashed - 理查德·希思菲尔德、劳伦斯·柯比等人。 (2000)。不理想,但值得中级程序员练习本书中编写的问题。这是 comp.lang.c 贡献者建议的一种类似食谱的好方法。
Object-oriented Programming with ANSI-C (免费 PDF) - Axel-Tobias Schreiner (1993)。
代码有点复杂。如果您想要 C++,请使用 C++。当然,它只使用 C90。
Extreme C: Push the limits of what C and you can do - 卡姆兰·阿米尼 (2019)。本书以您现有的 C 知识为基础,可帮助您成为更专业的 C 程序员。您将深入了解算法设计、功能和结构,并了解 POSIX 环境中的多线程和多处理。
专家
Expert C Programming: Deep C Secrets - 彼得范德林登 (1994)。 Sun 编译器团队提供了许多有趣的信息和 war 故事,但有些地方有些过时。
Advanced C Programming by Example - 约翰·W·佩里 (1998)。
Advanced Programming in the UNIX Environment - Richard W. Stevens 和 Stephen A. Rago (2013)。关于如何从 C 代码使用 Unix API 的全面描述,但没有太多关于 C 编码的机制。
未分类
Essential C (免费 PDF) - 尼克·帕兰特 (2003)。请注意,这在几个方面描述了 C90 语言(例如,在讨论 //
注释和在代码中的任意位置放置变量声明时),因此应该谨慎对待。
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,这使得它现在不太值得推荐。
有些人主张将“陷阱和陷阱”从这份 list 中删除,因为它使一些人陷入了犯错的境地;其他人继续争论将其列入。也许它应该被视为一本“专家”书,因为它需要对 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 规则的嵌入式系统;它并不适用于任何地方。 (例如,编译器通常对符号表之类的东西使用动态内存分配,如果不进行动态内存分配,即使不是荒谬的,也会很困难。)
在 Beginner's C 上存档的 ACCU 审查书籍列表(116 个标题)来自 2007 年和 Advanced 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。
也别用书
Let Us C (第 16 版,2017 年),作者是 Yashwant Kanetkar。许多人认为它是一本过时的教 Turbo C 的书,并且有很多过时的、误导性的和不正确的 Material 。例如,第 137 页讨论了来自
printf("%d %d %d\n", a, ++a, a++)
的预期输出。并且不会将其归类为
undefined behaviour正如它应该。它还一贯提倡不可移植和有缺陷的编码实践,例如使用
gets
,
%[\n]s
在
scanf
, 存储
getchar
的返回值在
char
类型的变量中或使用
fflush
在
stdin
.
Learn C The Hard Way (2015) 由 Zed Shaw。一本评论褒贬不一的书。
A critique of this book作者:蒂姆·亨特纳尔:
To summarize my views, which are laid out below, the author presents the material in a greatly oversimplified and misleading way, the whole corpus is a bundled mess, and some of the opinions and analyses he offers are just plain wrong. I've tried to view this book through the eyes of a novice, but unfortunately I am biased by years of experience writing code in C. It's obvious to me that either the author has a flawed understanding of C, or he's deliberately oversimplifying to the point where he's actually misleading the reader (intentionally or otherwise).
“Learn C The Hard Way” 不是我可以推荐给正在学习编程和学习 C 的人的书。如果您已经是其他相关语言的称职程序员,那么它代表了一个有趣且不寻常的说明C,尽管我对本书的某些部分有所保留。乔纳森·莱夫勒
过时的
Practical C Programming (3rd Edition) - Steve Oualline (1997)(初学者)
其他贡献者 ,不一定记入修订历史,包括:
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 ,
Steve Summit ,
Tim Ring ,
Tony Bai ,
VMAtm
我是一名优秀的程序员,十分优秀!