【C】 01 - 再学C语言
“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)足够了。
【C】 01 - 再学C语言的更多相关文章
- 小朋友学C语言(7)
数组 一.数组简介 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比 ...
- 小C的故事(快速学C语言,,,极速版!)
前几天这篇博客写了太多废话! 删啦~~. 本篇博客只是为chd A协的全嫩小鲜肉入门C语言的预科, 如果你在此处学习C语言, 不幸走火入魔, 小弱概不负责. //请直接随便找个C语言编译器,抄一下下面 ...
- 边看MHA源码边学Perl语言之一开篇
边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...
- 快看Sample代码,速学Swift语言(1)-语法速览
Swift是苹果推出的一个比较新的语言,它除了借鉴语言如C#.Java等内容外,好像还采用了很多JavaScript脚本里面的一些脚本语法,用起来感觉非常棒,作为一个使用C#多年的技术控,对这种比较超 ...
- C语言和C++的应用领域都在哪些?学C语言好,还是学习C++好?
从事嵌入式开发十几年,基本上围绕着这两种编程语言展开,都可以直接操作底层的编程语言,用的越熟练越是感觉工具属性越强.虽然两种编程语言分属于不同的编程思想,用的时间长了觉得差异也不是很大,现在就个人的从 ...
- 从零开始学C语言
从零开始学C语言 @阆苑祁寒 更新时间:2019-09-13 写在前面:本文从一个初学者的角度,给出了对C语言的简单理解.如有谬误,敬请指出! Week1——基本语法 #include <std ...
- 001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学
001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学 welcome to Java World 欢迎来到Java世界 一起领略Java编程世界的奥秘与奥妙 ...
- 我是先学C语言还是先学C++,实不相瞒,鱼和熊掌可兼得!
这是最近一周时间几个读者小伙伴所提的问题,我顺手截了两个图. 实不相瞒,这类问题之前也经常看到. 每次遇到这种问题,看起来很简单,但是打字一时半会还真说不清,想想今天周末了,写一篇文章来统一聊 ...
- [Python]再学 socket 之非阻塞 Server
再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...
随机推荐
- GPRS模块上电后复位会导致开机函数不正常的问题原因及解决方法
之前使用的开机函数 void Gprs_modem_start_up(){GPIO_SetBits(GPIOB,GPIO_Pin_0); //RESET 脚要置成高电平,防止重启do{ GPIO_Se ...
- BLAST - 序列数据库搜索
我生信入门,老师就要求我学好blast比对,说得也确实是很有道理,是个人都知道比对是最基本的东西,现在再想想那老师的建议,也只能呵呵一笑. 北大生物信息公开课有一章专门讲得序列数据库搜索,可以好好看看 ...
- 作业3---for语句及分支结构else-if
1.本次课学习到的知识点: (1)for语句的一般表达式,执行顺序: (2)指定次序的循环程序设计:数列的累加.累乘等: (3)else-if实现的分支结构可以判断语句的真假 2.实验过程中遇到的问题 ...
- oracle怎样用触发器将一张表的数据添加到另外一张表中
好吧,我就假设你两个表的数据结构相同吧create table TabA( address varchar2(50), press varchar2(50), city varchar2(50) )/ ...
- Windows Store App 访问应用内部文件
访问应用程序内部的文件可以使用多种不同的方法,13.1节中已经介绍过相关的方法,除此之外,还可以使用文件的URI地址直接对文件进行检索,这种访问方式需要用到StorageFile类的静态方法GetFi ...
- 电源相关知识—S0、S1(POS)、S2、S3(STR)、 S4、S5、睡眠、休眠、待机
转 http://blog.sina.com.cn/s/blog_52f28dde0100l3ci.html APM https://en.wikipedia.org/wiki/Advanced_Po ...
- iOS开发网络篇—监测网络状态
iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...
- FBI是如何破获“美国少女”裸照勒索案的
9月30日消息,据外国媒体报道,美国FBI昨日披露,“美国少女”(Miss Teen USA )卡西迪·伍尔芙(Cassidy Wolf )遭遇黑客通过电脑摄像头偷拍裸照兼敲诈勒索一案的嫌疑人已经被 ...
- 手把手教你用python抓网页数据
http://www.1point3acres.com/bbs/thread-83337-1-1.html
- ubuntu13.04 nfs配置
开发板和主机之间共享文件,常常需要配置nfs服务: 服务器端安装:root#:apt-get install nfs-common root#:apt-get install nfs-kernel-s ...