“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. JQuery text()、html() 以及 val()

    获得内容 - text().html() 以及 val() 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元 ...

  2. vue学习笔记之v-for与-repeat

    今天看到一个v-repeat的例子 <body> <ul id="tags"> <li v-repeat="tags"> { ...

  3. 深入理解JS闭包

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  4. C#微信公众号开发-高级接口-之模板消息开发,附源码

    个人觉得模板消息功能的增加对公众号的作用非常大,可以说是真正意义上的实现了所谓的轻app,商家可以通过模板消息给用户发送重要的信息,交易.预约.消费.邮件.物流等信息.之前我做过的系统通过邮件发送订单 ...

  5. Spring 中的 JDBC 事务

    Spring 对 JDBC 的支持 JdbcTemplate 简介 •为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架. • ...

  6. oracle生成行方法

    数据库记录是行的集合 set of row, 那么如何如何生成集合呢? oracle中常用的是 递归查询(with ... union all ...) 以及 connect by(树形查询) htt ...

  7. BCG界面库下的Windows8 UI界面样式www.webui8.com

    BCG界面库下的Windows8 UI界面样式(Metro风格)控件主要有以下一些功能: 规则的大块磁贴 支持完整键盘导航 Tile组 标题(Caption) 标题按钮(Caption buttons ...

  8. UVa 1626 Brackets sequence (动态规划)

    题意:用最少的括号将给定的字符串匹配,输出最优解.可能有空行. 思路:dp. dp[i][j]表示将区间i,j之间的字符串匹配需要的最少括号数,那么 如果区间左边是(或[,表示可以和右边的字符串匹配, ...

  9. 关于listview排序的说明

    增加了排序属性后(即设置ListViewItemSorter属性),即便是把listview的内容全部清掉(listView.Items.Clear()),然后再重新添加行(listView.Item ...

  10. The differences between Java application and Java applet

    在Java语言中,能够独立运行的程序称为Java应用程序(Application).Java语言还有另外一种程序--Applet程序.Applet程序(也称Java小程序)是运行于各种网页文件中,用于 ...