警告!
这是一个质量参差不齐的随机书籍列表。在一些人(有些情有可原)看来,它已不再是一个推荐书籍的列表。其中一些书籍中包含明显错误的陈述或教授错误/有害的做法。了解此类书籍的人可以编辑此答案以帮助改进它。
请参阅The C book list has gone haywire. What to do with it?,以及Deleted question audit 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版本在内。它不是一本教程,对于初学者可能不太适合。如果你需要编写一个C语言编译器,这本书非常有用,因为作者在开始时也是这样做的。
C Pocket参考手册(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编程(第2版) - K. N. King(2008年)。一个学习C语言的好书。
C语言程序设计(第4版) - Stephen Kochan(2014年)。一个很好的通用介绍和教程。
C Primer Plus(第5版) - Stephen Prata(2004年)
C语言入门经典 - Al Kelley/Ira Pohl(1998年)。
C语言经典教程(免费在线) - Mike Banahan,Declan Brady和Mark Doran(1991年)。
C语言程序设计(第8版) - Paul Deitel和Harvey M. Deitel(2015年)。对初学者来说有很多好的技巧和最佳实践。索引非常好,可以作为一个不错的参考(只是不完全全面,而且非常浅显)。
Head First C - David Griffiths和Dawn Griffiths(2012年)。
入门C语言(第5版) - Ivor Horton(2013年)。非常好地解释了指针的使用,使用了许多小而完整的程序。
21天学会C语言 - Bradley L. Jones和Peter Aitken(2002年)。非常好的入门材料。
中级
现代C语言 — Jens Gustedt (2017年第一版; 2019年第二版)。从初级C到高级C,分为5个层次(初识、熟悉、认知、经验、抱负)。涵盖了C11和C17,包括线程和原子访问等其他书籍很少涉及的特性。并非所有编译器在所有环境中都能识别这些特性。
C接口与实现 - David R. Hanson (1997年)。提供了如何以通用和可重用的方式定义C中接口和实现之间的边界的信息。它还通过将这个原则应用于C中常见机制和数据结构的实现(如列表、集合、异常、字符串操作、内存分配器等)来演示这个原则。基本上,Hanson将他在构建Icon和lcc时编写的所有代码提取出来,以其他人可以重用于自己的项目的形式呈现。它是使用现代设计技术(包括Liskov的数据抽象)的良好C编程模型,展示了如何将一个大型C项目组织为一组有用的库。
C谜题书 - Alan R. Feuer (1998年)
标准C库 - P.J. Plauger (1992年)。它包含了C89标准库的完整源代码,以及对设计的广泛讨论和代码设计的原因。
21世纪C语言:新学派的C技巧 - Ben Klemens (2012年)。除了C语言,本书还解释了gdb、valgrind、autotools和git。关于风格的评论在最后一部分(第6章及以后)。
C语言中的算法 - Robert Sedgewick (1997年)。让您真正掌握在C中实现算法的能力。非常清晰易懂;可能会让您想要放弃其他所有的算法书籍,只保留这一本。
C语言问题解决与程序设计(第6版) - Jeri R. Hanly和Elliot B. Koffman (2009)。
数据结构 - 使用C的高级方法 - Jeffrey Esakov和Tom Weiss (1989)。
C语言大放异彩 - Richard Heathfield,Lawrence Kirby等人 (2000)。虽然不是最理想的选择,但对于中级程序员来说,练习这本书中的问题是值得的。这是comp.lang.c贡献者建议的一种很好的类似于食谱的方法。
- 使用ANSI-C进行面向对象编程(免费PDF)- Axel-Tobias Schreiner(1993年)。
代码变得有点复杂。如果你想用C++,就用C++吧。它只使用C90,当然。
专家
未分类
MISRA-C - 行业标准,由Motor Industry Software Reliability Association发布和维护。涵盖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评论书籍列表,包括初学者的C(116本书)(2007年)和高级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。
同时,请不要使用Yashavant Kanetkar的《Let Us C》(第16版,2017年)这本书。很多人认为这本书已经过时了,它教授的是Turbo C,并且包含了很多过时、误导和错误的内容。例如,第137页讨论了
printf("%d %d %d\n", a, ++a, a++)
的预期输出,并没有将其归类为
未定义行为,而实际上应该是这样的。它还一直推广不可移植和有错误的编码实践,比如使用
gets
,在
scanf
中使用
%[\n]s
,将
getchar
的返回值存储在
char
类型的变量中,或者在
stdin
上使用
fflush
。
《学习C语言的艰难之路》(2015年)是由Zed Shaw所著的一本书,评价褒贬不一。
Tim Hentenaar在《对这本书的批评》中写道:
总结一下我的观点,作者以一种过于简化和误导性的方式呈现了材料,整个内容混乱不堪,他提出的一些观点和分析实际上是错误的。我试图从一个初学者的角度来看待这本书,但不幸的是,我被多年在C语言编写代码的经验所影响。对我来说,很明显作者对C语言的理解存在缺陷,或者他故意过于简化以至于误导读者(无论是有意还是无意)。
《学习C语言的艰难之路》不是一本我能够推荐给那些既在学习编程又在学习C语言的人的书。如果你已经是其他相关语言的熟练程序员,那么它代表了对C语言的有趣而独特的阐述,尽管我对书中的部分内容有所保留。——Jonathan Leffler
过时
其他贡献者,不一定在修订历史中得到认可,包括:
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