“C语言还用再学吗?嵌入式工程师可是每天都在用它,大家早就烂熟于心,脱离语言这个层面了”。这样说不无道理,这门古老的语言以其简单的语法、自由的形式的而著称。使用C完成工作并不会造成太大困扰,所以很少有人会回头再仔细看看它。但在现实中却经常会有一些令人抓狂的bug,最终发现竟是语法使用错误造成的,而作者不乏老程序员。仔细想想,其实每个人对C都有些含糊不清的地方,C好像又变得复杂起来。但事实却不是这样,C语言依然是简洁的,它的语法只需几页纸便可讲清。回想起来,其实是我们学得太过匆忙、太过功利,记忆了一堆零碎的语法便开始开发生涯了。
追问本质的学习被很多人看作是不必要、过于学究的。而肤浅学习的人往往是以修补各种漏洞、缺陷作为自己的主要工作,而且乐此不彼。我没有能力和精力去彻底弄懂C的本质,但在工作了几年后,我想重新认识一下C,对含混之处作一些澄清。当然对熟悉C的人来说,常规的应用式学习是没有意义的,我们要深入本质,去看看C的本来面貌。C语言高效,易移植,功能强大。而在形式上它又是自由的,留了更多的责任给编译器和开发者。对一些实现细节,规范不作具体要求,而是由编译器根据需要自行决定。这一类细节可以分为以下三类:
(1)基于实现(implementation defined)。要求编译器文档给出明确定义,使用者对其无歧义。
(2)不作说明(unspecified)。编译器可以选择自己的处理方式,且该方式可能会变,不在文档中作定义,使用者不可作假设。
(3)不作定义(undefined)。编译器可以选择不去处理这些case,所以可能出现任何结果,应避免使用。
C++复杂凌乱的语法深受诟病,但C偶尔也会从C++引进一些好的语法,而且还会另外作一些扩充。C规范可分为三个阶段:
(1)规范形成前(旧C、old style C)。基本以第一版的《The C Programming Language》为规范,C语言的基本面貌已经确定,与我们现在看到的差别不大。由于历史原因,仍有编译器只支持旧C(我第一个东家就是)。
(2)旧规范(C89或C90)。近乎完美的版本,也就是我们现在基本看到的C,是目前支持得最好且应用最广泛的版本。《The C Programming Language》也随即出了第二版,至今未更新。
(3)新规范(C99和C11)。时隔20年后,C从各大编译器吸取营养,作了一些不错的扩展。但平时使用得并不多,而且还没有得到完全的支持。其中C99变化较大,C11更多的是对C99的调整。
【参考资料】
[1] 《ISO/IEC 9899:2011 (Programming Language C)》,2011
最新版(2011)C语言规范,一切都来自这里,作为C语言程序员怎能不看!规范表达简洁明确,从语言学的角度定义C。看了才知道,原来没有那么多细节,只是衍生出来的罢了。花点时间读读原理,比记忆细节更有效。
[2] 《The C Programming Language》(2nd),K&R,1988
没什么要说的,C语言圣经。小而精,从内容到组织都是经典。但不太适合入门,建议作为提升读物细读。
[3] 《C Primer Plus》(6th),S. Prata,2013
一本经典的大部头C语言教材,内容全面,语言流畅,组织结构合理。虽然不能面面俱到,但基本覆盖了C语言的大部分细节,有大量示例代码,但对新规范讲解不深入。适合从入门到提升,程序员必备C语言书。
[4] 《C Programming: A Modern Approach》(2nd),K.N. King,2008
极好的一本教科书,适合入门和学习,有大量不错的例题和习题。全书组织合理,结构清晰。内容全面实用,但不刻意求全求偏,有所侧重和回避。
[5] 《The C Book》(2nd),Mike Banahan,1991
一本老而经典的C语言进阶读物,内容深入而实用。对很多概念作了透彻讲解,言简意赅,有独立见解,读来有趣。
[6] 《C: In a Nutshell》,Tony Crawfard,2005
C完整参考书,可作参考书,但不适合入门。以C规范的风格讲解C,包括深层次语言原理。可看作对规范的整理和重新阐述,但比规范易懂。
[7] 《Expert C Programming: Deep C Secrets》,Peter Linden,1994
较深入地探讨了C的一些易含糊概念,包括一些语法的来龙去脉。提出了C设计中不完善的地方,从语言设计的角度阐述易出错原因。经典著作,做到了知己知彼。
[8] 《C Traps and Pitfalls》,Andrew Koening,1089
一本经典的C语言提升读本,对C中易出错的概念作了有序而深入的讲解。从语言的本质和原理角度澄清了一些难点,言简意赅,篇幅短小而内容丰富。
[9] 《The C Puzzle Book》,Alan Feuer,1998
一本精巧的小册子,对C中容易含混的内容作了针对性的探讨,值得一读。
[10] 《C Programming FAQs》,Steve Summit,1995
搜集和解释了C的一些疑难点和风格建议,针对性强,语言简洁明了。很适合作为C语言提升的一本小册子,部分题材新颖有趣,值得一读。
[11] 《Advanced C: Tips and Techniques》,Paul Anderson,1988
讨论了一些C语言的高级内容,对提高C的认识和实践能力很有帮助。虽然含有一些过时内容,但总体很有参考价值。
[12] 《Pointers On C》,K. Reek,1997
以指针为侧重点,但其实是一本丰富而全面的C语言教材。偏向实用性,配有大量习题,适合入门学习。
[13] 《Practical C Programming》(3rd),Steve Ouallire,1997
从应用和实践角度讲C,不深究语言本身。还有些编程风格、经验和思想,适合进阶学习。
[14] 《Linux C 编程一站式学习》,宋劲彬,2008
以Linux和C为载体,讲述计算机和编程原理。介绍了很多编程相关的计算机知识,内容很丰富,有很大篇幅高级内容。作者参考了很多资料,选材比较讲究,适合进阶学习。
[15] 《Writing Solid Code》,Steve Maguire,1993
讨论了各种避免bug的代码风格,尤其强调如何让bug更易暴露。书虽然较老,但都是一些很经典和实用的方法。提高项目质量必读。
[16] 《The CERT C Secure Coding Standard》,RC. Seacord,2008
美国国防部支持制定的一套编程准则,对C语言安全编码的一些法则和建议。整理了C的常见错误和解决方案,提高代码质量必读!好的风格和习惯是提高代码质量的重要手段。
[17] 《C Pocket Reference》,Peter Prinz,2002
C语言规范浓缩简易版,语言简练,内容详实。很小的一本小册子却包罗万象,书如其名。
[18] 《Essential C》,Nick Parlante,1996
C语言摘要,挑选了最简单和最常用的概念,适合入门和速成。
[19] 《21st Century C: C Tips from the New School》,Ben Klemens,2012
介绍C开发相关环境和工具,挑选的是近期比较热门的工具,可以提高项目开发效率。另外还介绍了新标准的一些内容,但不是系统研究。该书可以作项目开发工具书。
[20] 《Understanding and Using C Pointers》,Rechard Reese,2013
C指针进阶教程,对其用法有较详尽的讲解。但略显拖沓,讨论不深入。
[21] 《Programming in C》(4th),Stephen Kochan,2014
一本老教材,适合零起步,偏应用。但比较啰嗦,讲解也不深入,例子太多。
[22] 《C Programming: Just the FAQs》,Paul Srchisholm,1995
以单个问题的形式介绍C,少部分问题是疑难点,大部分是语言和库的介绍。覆盖面较广,但组织和表达不够简练。
[23] 《What Every Computer Scientist Should Know About Floating-Point Arithmetic》,David Goldberg,1992
浮点数表示的科普论文,有比较详细的分析和论证。对程序员而言,用它学习浮点表示(IEC 60559)足够了。