“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的调整。

  本系列目录

    02 - 程序结构和预处理

    03 - 数据类型

    04 - 表达式和语句

    05 - 声明和定义

    06 - 标准库概述

  博客总目录这里


【参考资料】

[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语言的更多相关文章

  1. 小朋友学C语言(7)

    数组 一.数组简介 C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比 ...

  2. 小C的故事(快速学C语言,,,极速版!)

    前几天这篇博客写了太多废话! 删啦~~. 本篇博客只是为chd A协的全嫩小鲜肉入门C语言的预科, 如果你在此处学习C语言, 不幸走火入魔, 小弱概不负责. //请直接随便找个C语言编译器,抄一下下面 ...

  3. 边看MHA源码边学Perl语言之一开篇

    边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...

  4. 快看Sample代码,速学Swift语言(1)-语法速览

    Swift是苹果推出的一个比较新的语言,它除了借鉴语言如C#.Java等内容外,好像还采用了很多JavaScript脚本里面的一些脚本语法,用起来感觉非常棒,作为一个使用C#多年的技术控,对这种比较超 ...

  5. C语言和C++的应用领域都在哪些?学C语言好,还是学习C++好?

    从事嵌入式开发十几年,基本上围绕着这两种编程语言展开,都可以直接操作底层的编程语言,用的越熟练越是感觉工具属性越强.虽然两种编程语言分属于不同的编程思想,用的时间长了觉得差异也不是很大,现在就个人的从 ...

  6. 从零开始学C语言

    从零开始学C语言 @阆苑祁寒 更新时间:2019-09-13 写在前面:本文从一个初学者的角度,给出了对C语言的简单理解.如有谬误,敬请指出! Week1——基本语法 #include <std ...

  7. 001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学

    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学 welcome to Java World 欢迎来到Java世界 一起领略Java编程世界的奥秘与奥妙 ...

  8. 我是先学C语言还是先学C++,实不相瞒,鱼和熊掌可兼得!

    这是最近一周时间几个读者小伙伴所提的问题,我顺手截了两个图. 实不相瞒,这类问题之前也经常看到.     每次遇到这种问题,看起来很简单,但是打字一时半会还真说不清,想想今天周末了,写一篇文章来统一聊 ...

  9. [Python]再学 socket 之非阻塞 Server

    再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...

随机推荐

  1. GPRS模块上电后复位会导致开机函数不正常的问题原因及解决方法

    之前使用的开机函数 void Gprs_modem_start_up(){GPIO_SetBits(GPIOB,GPIO_Pin_0); //RESET 脚要置成高电平,防止重启do{ GPIO_Se ...

  2. BLAST - 序列数据库搜索

    我生信入门,老师就要求我学好blast比对,说得也确实是很有道理,是个人都知道比对是最基本的东西,现在再想想那老师的建议,也只能呵呵一笑. 北大生物信息公开课有一章专门讲得序列数据库搜索,可以好好看看 ...

  3. 作业3---for语句及分支结构else-if

    1.本次课学习到的知识点: (1)for语句的一般表达式,执行顺序: (2)指定次序的循环程序设计:数列的累加.累乘等: (3)else-if实现的分支结构可以判断语句的真假 2.实验过程中遇到的问题 ...

  4. oracle怎样用触发器将一张表的数据添加到另外一张表中

    好吧,我就假设你两个表的数据结构相同吧create table TabA( address varchar2(50), press varchar2(50), city varchar2(50) )/ ...

  5. Windows Store App 访问应用内部文件

    访问应用程序内部的文件可以使用多种不同的方法,13.1节中已经介绍过相关的方法,除此之外,还可以使用文件的URI地址直接对文件进行检索,这种访问方式需要用到StorageFile类的静态方法GetFi ...

  6. 电源相关知识—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 ...

  7. iOS开发网络篇—监测网络状态

    iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...

  8. FBI是如何破获“美国少女”裸照勒索案的

     9月30日消息,据外国媒体报道,美国FBI昨日披露,“美国少女”(Miss Teen USA )卡西迪·伍尔芙(Cassidy Wolf )遭遇黑客通过电脑摄像头偷拍裸照兼敲诈勒索一案的嫌疑人已经被 ...

  9. 手把手教你用python抓网页数据

    http://www.1point3acres.com/bbs/thread-83337-1-1.html

  10. ubuntu13.04 nfs配置

    开发板和主机之间共享文件,常常需要配置nfs服务: 服务器端安装:root#:apt-get install nfs-common root#:apt-get install nfs-kernel-s ...