前 言
本书面向所有的C语言初学者,并假定读者不具备任何编程经验。甚至,读者只要具备中学的文化程度,就完全可以把这本书作为自学教材,来学习C语言程序设计。
尽管如此,本书的内容却又是全面详尽而又不失深度的。因此本书对于拥有了一定C语言编程知识和一定编程能力的读者(比如那些通过了某某等级考试但却恍然发现自己根本不懂得编程的大学生们)来说,也具有相当的参考价值。因为本书在某些方面和某种程度上,针对的是国内C语言学习中存在了多年的积弊和流行甚广、积非成是的曲解及误区。
本书的内容并非仅限于讲解C语言的语法,同时也涉猎了怎样用C语言进行思考并解决在实际使用过程中可能遇到的诸多问题。
C是什么
C语言是一种强大、高效、优美的程序设计语言。自20世纪70年代问世以来,不但一直深受专业人士的重视,而且赢得了无数业余爱好者的青睐。同样,C语言也普遍地被认为是一种极佳的程序设计入门的教学语言。
最初,C语言是作为一种程序员的工作语言而出现的,实用、简洁、高效、表达力强、可移植性好是其公认的基本特征。
C语言的处女作是计算机史上具有里程碑意义的操作系统——UNIX(1)。UNIX的两位作者还因此获得了1983年的图灵奖(2)。评审委员会对UNIX的评价是:“UNIX系统的成功在于它对一些关键思想所作的恰如其分的选择和精悍的实现。UNIX系统关于程序设计的新思想和新方法成了整整一代软件设计师的楷模”。而完成这种“精悍的实现”以及描述“程序设计的新思想和新方法”的就是C语言。
此后,C语言迅速地成了软件业最重要的一种程序设计语言,独领风骚,风靡一时。后来的多数操作系统都是用C语言编写的,同时C语言也成了编写其他应用软件的首选语言。
C之近亲
20世纪90年代,从C语言发展、衍化出了C++、Java等程序设计语言,它们都与C语言有接近或相似之处(3)。这些语言目前在软件业也都具有很重要的地位,然而这并不妨碍C语言本身仍然是软件行业的一种主流语言。事实上,在某些领域,如嵌入式系统开发等,C语言始终是一种不可替代的工具语言。
精通C语言是掌握C++等语言几乎必然的基础和前提。精通C++而不懂C语言者,未尝闻之。因为在某种意义上,可以不太精确地说,C是C++的子集,C++是对C的扩展。
类似的,一个精通C语言的人,只要树立了面向对象编程的思想,过渡到掌握Java语言并没有什么本质的困难,但反过来从Java语言转到C语言就很难说了。原因在于,Java语言是一种面向虚拟机的语言,它隐藏了真实机器的细节;而C语言则是面向真实机器的。就目前来说,C语言是最接近于机器语言的高级语言之一。
为何学C
C语言更接近于机器语言的这一特点,不仅决定了它的代码效率很高,而且使得它在作为一种教学语言时,能使学习者更为深刻地理解计算机的工作机制以及程序的本质。无疑,这将为学习者的软件职业生涯打下坚实的技术基础。
在程序的结构上,C语言易于体现结构化程序的设计思想。使用C语言更容易写出可靠、易懂的代码。同时,C语言不像Pascal那么严格、刻板,相反,C语言是一种充满着自由气息的语言。这种自由体现在它的创造能力之中:丰富的运算,强大的构造新数据的能力和对思想清晰、简洁、自然的表达方式。
然而自由并不是没有代价的,这种代价就是需要对错误保持永远不懈的警惕。编程需要清晰的概念、缜密的逻辑和精确的描述。而使用C语言编程尤其如此,因此C语言无疑是培养学习者软件职业素质和塑造核心技术能力的极好素材。
C语言是简洁的,但却是有力的;C语言是平易朴实的,但却是优美雅致的。只要你愿意,你总是能够通过C语言从容不迫地表现出你的创造力,这就是C语言的魅力。然而,这并不是轻而易举就能做到的。所以使用C语言编程既是一种美的体验,同时又是一种对个人智力的挑战和提升。
“老王卖瓜”
起点从低,终点从高,范围从广,内涵从深,是本书的四个原则。具体说来,表现在以下几方面。
首先,本书强调了基本概念的准确、权威与通俗易懂,对C语言的基本概念的解释是递进式和螺旋式的。在书中首次遇到某一概念时,多是以易于理解为主要出发点,用贴切的日常生活用语进行解释。而当再次接触到这一概念时,解释则是以精确和全面为原则。这样做更有利于读者循序渐进地进行学习。而在每章的最后,都对该章所涉及的概念进行了严谨、规范、细致的总结。
本书还具有丰富的图解,这些图解有的是用于解析C语言的基本概念,有的是对原理性的内容进行诠释,以帮助读者理解那些难于用语言表述的概念和原理。
其次,本书强调结构化程序设计思想,程序代码结构清晰自然而富有条理。而树立结构化程序设计思想则是进一步学习面向对象编程语言必需的前提条件和必要的基础。
本书试图让初学者从一开始就能以正确的方法养成良好的编程习惯。无数的事例表明,良好的编程修养对程序的正确性和可读性具有着不可忽视的重要作用。理解C语法与擅用C写代码是两个不同的概念,就如同背会英语单词不等于会使用英语一样。在编程时不但要知道C语言的规则还应该了解编程的规律。在学习的一开始就着手培养并逐步养成良好的编程习惯的重要性无论怎么强调都不过分。因为我们知道,克服一个坏习惯要比养成一种好习惯要困难得多。
C语言是一种表达能力很强的语言,本书强调的是对解决问题的步骤、方法在编程前透彻周到的思考和用C语言自然的表达。所以本书所涉及的内容不仅仅是C语言的语法,同时也包括用C语言看待问题的世界观和C语言应用的方法论。
最后,本书大部分小节后面都配有与该小节知识相关的练习,这样有利于初学者巩固刚刚学习的知识,并能够通过对例题的模仿,逐步学会有条理地思考和具备用C语言简洁、明确、优美地进行表达思想的能力。
各小节后面配备的练习中,多是一些简单易懂的问题,具备中小学数学基础的读者完全能够理解这样的问题(很多直接选自于小学课本或习题集),解决问题的方法也不难。这部分练习强调的重点在于用C语言解决问题的方法以及C语言的基本语法知识。
然而只解决简单的问题,并不能让人完全体会到C语言的强大和优美,反而可能会让人觉得编程是件简单而无聊的事情。事实上,编程是件非常有趣的事情,就如同解数学题目。所以在各章的例题中和每章的后面还配设了许多独创和精选的题目,这些题目本身不难理解,但问题所涉及的数据或解决问题的方法有一定难度,初学者可能不一定能马上全部完成,在没有完成的情况下,只要完成了各小节后面的练习,就不影响继续阅读和学习。毕竟学习的重点首先是C语言本身,而解决复杂的问题所涉及的是程序设计的两个核心概念——数据结构和算法。
总之,通过深入浅出以达到渐入佳境的目的,自始至终是本书写作时所信奉的原则和信条。此外,针对初学者容易犯的错误,在书中都有详细的提示和讲解。书中同样对良好的编程习惯和风格进行了总结和分析,这些内容在一般的C语言书籍中是难得见到的。
体现并遵循了C语言最新的发展是本书的另一个特点。本书不但介绍了目前多数编译器所遵守的C89标准,也介绍了C语言的最新标准C99,并在书中明确地指出哪些是新标准的内容,以使读者不至于在不支持C99标准的编译器上遭遇不必要的困惑。本书的代码符合C99标准,其中绝大多数也符合C89标准。在不支持C99标准的编译器上无法运行的少数代码,本书中都有特别注明。
本书还着重体现了“软件工程”和“软件测试”的思想。很奇怪的是它们一直被搞得与编程没有多少关系似的。实际上,离开了编程,“软件工程”和“软件测试”连继续存在一秒钟的必要性都没有。当然,这话也可以理解为,不懂得一些“软件工程”和“软件测试”的基本常识,又何以谈得上编程呢?本书对“软件工程”和“软件测试”思想的诠释主要体现在,对程序功能的完整、精确的定义的重视,以及在编程之前给出相应的测试数据等这样一些具体细节之中实现对思想的自然演绎。也就是说本书强调的是对“软件工程”和“软件测试”思想的贯彻而不是给读者灌输以空洞的教条。
最后想说的是,对本书的这些介绍,我个人认为是实事求是的。但究竟如何,我劝您还是“别看广告看疗效”。
内容安排
本书共分为3篇。
第1篇主要介绍了C语言的基本数据类型和基本控制语句,重点讲解了什么是数据结构以及什么是算法,期望能使读者领会编程的内涵以及编程背后的一些本质性的东西。
第2篇主要结合C语言的特点,讲解结构化程序设计的思想,并介绍了比较初级的数据结构——数组和指针的知识,以及它们在程序设计中的作用。本篇的主要意图是引导学习者写“更好”的代码。这里,所谓的“更好”是指代码的编写过程更有条理以及代码更具有可读性。当然,代码的正确性始终是衡量代码质量的第一标准,但是通过深入的学习就会发现,没有条理以及代码没有很好的可读性,代码的正确性是无从谈起的。
第3篇主要介绍C语言在组织复杂数据结构方面的超凡能力,以及一些涉及大型程序设计方面的必要知识。这里是本书的“肩膀”,本书衷心期待读者们能从这里跃到更高的境界。
本书中代码的使用编程环境是Dev C++。除了涉及有关C99新增加内容的代码外,绝大多数代码也可以在VC++、BC、TC2.0等环境下运行。
体例说明
在体例格式上,本书统一采用下面的表示方法。
语法描述
在说明语法形式时,必须的成分用黑体表示;需要用其他更具体内容替换的部分采用斜体描述,如:
其中的if()是这个语句的必要成分,而表达式、语句可能是一些具体的,如“i==5”、“j=3;”这样的表达式和语句。
对于可有可无的语法成分用斜体的“[]”表示,例如:
表示其中的[表达式1]、[表达式2]、[表达式3]是可选的。
程序代码
为醒目起见,完整的程序源代码采用了和编辑器类似的字体,并按如下样式排版:
程序输出
本书中的程序,皆为控制台程序,其用户界面为类似于Windows操作系统中“命令提示符”(4)那样的CUI界面。
很多人习惯于“命令提示符”的白字黑背景的样子,实际上在Windows操作系统中可以把界面设置成白底黑字的。这样的设置比较养眼(对于书籍来说还省墨,可以降低印刷成本,也更环保)。
特殊按键
键盘上有些按键不易表达,比如回车换行键,本书将采用这样的格式来表示——[CR]。其他的特殊按键将在首次用到的时候具体说明。
鉴于笔者的学识所限,本书难免有错误、疏漏或不尽如人意之处,笔者在此恳请广大读者能不吝指教。您对本书有任何批评、看法、意见或建议,都可以直接与本书作者联系,联系方式:KBTiller@163.com。
————————————————————
(1) 严格地说,UNIX诞生于C语言之前,最初是用汇编语言完成的。
(2) 图灵奖(A. M. Turing Award)是计算机界最负盛名的奖项,由美国计算机协会(ACM)于1966年设立,专门奖励那些对计算机事业作出重要贡献的个人,素有“计算机界诺贝尔奖”之称。
(3) 增加了面向对象编程的内容是这些语言与C语言的一个显著的不同之处。
(4) 在Windows的附件程序组中提供了“命令提示符”界面。