“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. Lambert漫反射.BLinnPhong及Phong模型 Unity自带的在Lighting.cginc里

    1.漫反射 此模型属于经验模型,主要用来简单模拟粗糙物体表面的光照现象 此模型假设物体表面为理想漫反射体(也就是只产生漫反射现象,也成为Lambert反射体),同时,场景中存在两种光,一种为环境光,一 ...

  2. Sqlserver2012 中文乱码解决

    1.在Windows Azure的数据库中,如果选择默认字符编码,那么在创建表字段是,字符串类型应该为nvarchar,如果是varchar将会出现乱码,同样的的在sql语句中生命变量,也是需要将字符 ...

  3. iOS开发Swift篇—(十)方法

    iOS开发Swift篇—(十)方法 一.简单说明 跟其他面向对象语言一样,Swift中的方法可以分为2大类: (1)实例方法(Instance Methods) 在OC中,实例方法以减号(-)开头 ( ...

  4. java 构造方法

    class MyTestClass { public int Value; public boolean equals(MyTestClass obj){ return obj.Value ==thi ...

  5. 转: MVC设计思想简介

    模型-视图-控制器(MVC)是80年代Smalltalk-80出现的 一种软件设计模式,现在已经被广泛的使用. 1.模型(Model) 模型是应用程序的主体部分.模型表示业务数据,或者业务逻辑. 2. ...

  6. Rhel6-vpn配置文档

    系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.160 server60.example.com 192.168.12 ...

  7. wine install 32bit netframewok

    WINEARCH=win32 WINEPREFIX=~/.wine32 winecfg env WINEARCH=win32 WINEPREFIX=~/.wine32 winetricks dotne ...

  8. 用CSS定义每段首行缩进2个字符 转

    应该遵循w3c所制定的html/xhtml标准来使用tag和编写网页.如果你对此不太了解,可以到w3c的网站www.w3.org去找相关资料,或者买一本xhtml的书(注意不要买过时的html的书,尽 ...

  9. Ubuntu中添加eclipse

    环境:Ubuntu 14.04 步骤: 1.安装配置JDK,详见 http://my.oschina.net/u/1407116/blog/227084 2.下载eclipse 从官网http://w ...

  10. NOI Linux JAVA

    右键open with another application 里输javaws 按ctrl+shift+del,调出火狐内置的清除最近的历史记录工具(或者按alt键弹出菜单,工具->清空最近历 ...