毋庸置疑,C是非常流行的编程语言。正是因为流行,和它有关的图书之多,可以用多如牛毛、汗牛充栋来形容。


       既然都已经这么多了,那我为什么还要再来一本,给牛增加负担呢?原因很简单:想看看是否能用一种和别人不同的方法来把C语言讲清楚。这本书面向初学者,但是,已经学过C语言的人也不妨读一读,因为我的讲解方法和对很多问题的阐述和别人不一样。请放心,我们不胡来,C语言有自己的标准,我们始终按标准来解释一切。 当然,自负是人类的共性,这本书是否真的能把C语言讲清楚,还得靠读者来检验。


       C语言难学吗?来自这个行业的声音始终自相矛盾。一方面,很多过来人声称C语言其实很简单;另一方面,很多初学者觉得很难,不得其门而入。仅就语法而言,C语言确实比较简单。但是,这种简单性使得很多人对它的掌握只停留在似是而非的表面上。似是而非的学习一开始很轻松,但你走不远。实际上,即使是声称已经掌握了这门编程语言的人,对很多语法要素的认识和理解也是错误的,在书写稍微复杂一些的代码时,也发现自己突然变得糊涂起来。


       那么,学习C语言的诀窍在哪里呢?


       首先,掌握它的类型系统并学会以类型的观点来构造和解析程序中的代码,这样你就不会迷路。如果你没有掌握C语言的类型系统,不会从类型的角度来分析一个表达式,说明你并没有掌握C语言。


       其次,你要了解C语言在整个计算机系统中的位置,知道它和操作系统或者硬件之间的关系;尤其是要理解库和C语言的关系,要明白是库拓展了C语言的实用性。除了C语言本身的简洁、优美和强大的表达能力外,C标准库和其他形形色色的库也是C语言变得流行并威力无穷的重要因素。


       写一本编程语言的通俗入门教材,最痛苦的莫过于你不能一下子展现事物的全貌和众多细节。尽管你知道它,也渴望表达,然而毫不客气地说,读者们并不需要它。读者不了解原委,没有耐心,记不住,而且恐惧。为此,本书力求在以下几个方面做一些突破:


       首先,C语言的知识点是网状的,是互相牵扯和交叉的,如果不加以梳理,随着阅读的深入,读者不理解的概念和术语将越来越多,从而产生挫败感。为了克服这一问题,我们把它变成线性的,还没讲到的内容一概不提,没讲过的概念一概不用;讲过了,有印象了,掌握了,再用来解释新的知识。


       其次,对于一本C语言的图书或者教材来说,最怕的是陷于细节而无法自拔,这往往会使读者成为语法机器而不能领略C语言的全貌,不知道C语言到底有什么实际的用处,更不知道哪些知识才是最重要的。


       因此,在内容的组织上,这本书的宗旨是先观其大略,而不是一上来就究其细节。如果只是陈列各种语法元素及其细节,我们可能需要写几百上千页,各种示例和习题堆砌其中。学生学完了,习题也做完了,还是莫名其妙,不知道C语言到底在整个计算机体系结构中处于什么位置,它和操作系统的关系是什么,也不知道为什么别人的程序可以播放音乐、处理图片、过滤网络数据包,而自己的程序只能打印哪些学生的成绩高于60分。


       第三,考虑到类型系统的重要性,从本书一开始就逐渐强化类型的知识和基于类型的语法分析。这是掌握C语言的关键,不可等闲视之。


       第四,多数教材和图书都从一个令初学者抓狂的语句
       printf ("hello world"); 
       开始,其理由是初学者可以马上看到“成果”,增加他们的学习兴趣。然而,除非是面向有编程经验的读者,否则这样做可能弊多利少。一方面,printf只是一个普通的输入输出函数,而且并不是C语言的组成部分,但初学者可能会先入为主地认为它就是C语言里的大梁;另一方面,这个函数并不是它表面上看起来的那样简单,实际上涉及多个知识点和概念,而且无法在一本书的开始部分完全展开。对于初学者来说,从一开始就将他们引入一个迷局可能并不值得。


       考虑到这些,本书一反常态,将输入输出留到第6章单独讲述。在此之前,我们用调试软件来跟踪程序的执行过程并观察执行结果。事实上,程序调试是非常重要的技能,所以本书这样安排应该是科学的。


       第五,本书有一章是专门介绍Windows编程的,虽然如走马观花一样简单,也会令某些读者质疑,毕竟C语言无关具体的硬件和操作系统平台。之所以这样安排,主要的目的是让读者领略C语言是如何在具体的平台上发挥作用的,以及库在这个过程中所起到的作用和扮演的角色,并从一个侧面解答C语言到底有什么用的问题。尽管C语言不依赖于平台,但用C语言写出来的程序却需要在具体的平台上执行。


       第六,本书引入了很多概念和术语,但在正文中夹杂这些术语的英文拼写可能会对部分读者造成阅读障碍。考虑到这一点,我们在每一章的前面用思维导图单独列出,这样做的另一个好处是可以让读者清楚地知道本章中都讲了哪些内容。


       第七,这本书开篇没有讲C语言的由来、历史、优点和应用领域,通常来说,这是一本C语言教材的格式化组成部分。但考虑到别的书都已经讲了,网络上也到处都有,所以我就没必要再啰唆了,请大家不要见怪。


       最后,这不是一本类似于辞典或者语法参考手册之类的书,内容的组织具有渐进和逐步展开的特点,应该从第1章开始顺序阅读。在内容的组织上,本书前半部分以如何实现输入输出为主线:第1章引入C语言编程的基本概念和要素;第2章讲解程序的调试;第3章快速介绍C语言里的大部分表达式和语句类型;第4和第5章介绍指针和数组,为输入输出做最后的铺垫;第6章完整介绍输入输出。在积累了相当的知识和经验后,本书后半部分以如何实现汉字的处理(第7章)、如何编写Windows程序以及编写一个复杂计算器为主线(第8、9、10、11章),继续讲解C语言的语法。为方便起见,第12章详细介绍了C语言里的每一种表达式。 


       在学习这门编程语言之前,必须先了解计算机的工作原理,有使用计算机的经验。对于大学新生来说,我并不担心这一点,学校自有他们的教学计划和进度安排;对于自学这门编程语言的人来说,这是需要注意的。


       纸质书的内容承载力有限,为了帮助大家更好地使用本书和理解书中的内容,我会准备一些辅助的学习资料,比如导读和习题解析之类的文档,它们都存放在我的个人网站上,网站的地址就在下面。当然,如果你有什么意见和建议,也可以在网站上留言,或者通过下面的电子邮件地址与我联系。


       在即将出版之前,编辑同学希望我能在前言里提一提我以前写过的书。说白了,就是要做做广告。我当时就大义凛然地一口回绝:“此事决不可为!谦虚谨慎乃做人之根本,休想让朕把写过《穿越计算机的迷雾》和《x86汇编语言:从实模式到保护模式》这两本书的事说出来!”


       王晓波和李双圆参与了本书的写作,我们在此共同祝愿读者们阅读愉快,早日通过本书掌握C语言的精髓。

李  忠           
2019年1月6日于长春   

更多推荐

《C语言非常道》李忠