资源预览内容
第1页 / 共1728页
第2页 / 共1728页
第3页 / 共1728页
第4页 / 共1728页
第5页 / 共1728页
第6页 / 共1728页
第7页 / 共1728页
第8页 / 共1728页
第9页 / 共1728页
第10页 / 共1728页
亲,该文档总共1728页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
在本章中你将学习下列内容。C 的历史和特性。编写程序所需的步骤。关于编译器和链接器的一些知识。C 的标准。 欢迎来到 C 的世界!C语言是一种强大的专业化编程语言,深受业余和专业编程人员的欢迎。本章为学习和使用这一强大而流行的语言做准备,并介绍了开发C程序时最可能使用的几种环境。 首先,让我们来看看C的起源及其特性,包括它有哪些优点和缺点。接着我们将了解编程的起源并探讨编程的一些基本原则。最后,我们讨论在一些常见系统上运行C程序的方法。1.1 C语言的起源 贝尔实验室的 Dennis Ritchie 在1972年开发了C,当时他正在与Ken Thompson 一起设计 UNIX操作系统 。然而,C并不是完全由Ritchie构想出来的。它来自Thompson的B语言,而B语言则来自。噢,这又是另外一个故事了。重要的是,C是作为从事实际编程工作的程序的一种工具而出现的,所以其主要目标是成为一种有用的语言。 多数语言都以实用为目标,但它们往往也会考虑其他一些方面。例如 Pascal 的主要目标是为学习良好的编程原则提供一个扎实的基础,而 BASIC 则是模仿英语,以便让不熟悉计算机的学生能够轻松地学会这种语言。这些目标很重要,但它们不总是与实际的使用需要相符。而 C 则是为编程人员开发的语言,这使得它成为当今人们首先的编程语言之一。1.2 使用 C 语言的理由 在过去的30年中,C已经成为最重要和流行的编程语言之一。它之所以得到发展,是因为人们尝试使用它后喜欢它。过去10年中,许多人从C转而使用更强大的C+语言,但C有其自身的优势,仍然是一种重要的语言,而且它还是通往C+的必由之路。学习C的过程中,你将认识到它的许多优点(见图1.1)。现在让我们首先来看其中的几个优点。1.2.1 设计特性 C是一种融合了控制特性的现代语言,而我们已发现在计算机科学的理论和实践中,控制特性是很重要的。其设计使得用户可以自然地采用自顶向下的规划,结构化的编程,以及模块化的设计。这种做法使得编写出的程序更可靠,更易懂。 1.2.2 高效性 C是一种高效的语言。 在设计上它充分利用了当前计算机在能力上的优点。C程序往往很紧凑且运行速度快。事实上,C可以表现出通常只有汇编语言才具有的精细控制能力(汇编语言是特定的CPU设计所采用的一组内部指令的助记符。不同的CPU类型使用不同的汇编语言)。如果愿意,你可以细调程序以获得最大速度或最大内存使用率。1.2.3 可移植性 C是一种可移植语言。这意味着,在一个系统上编写的C程序经过很少改动或不经修改就可以其他系统上运行。如果修改是必要的,则通常只须改变伴随主程序的一个头文件中的几项内容即可。多数语言原本都想具有可移植性,但任何曾将IBM PC BASIC 程序转换为 Apple BASIC 程序(它们还是近亲)的人,或者试图在 UNIX 系统上运行一个 IBM 大型机FORTRAN 程序的人都知道,移植至少是在制造麻烦。C 在可移植性方面处于领先地位。C 编译器(将C代码转换为计算机内部使用的指令的程序)在大约40多种系统上可用,包括从使用8位微处理器的计算机到Cray超级计算机。不过要知道,程序中为访问特定硬件设备(例如显示器)或操作系统(如Windows XP或OS X)的特殊功能而专门编写的部分,通常是不能移植的。 由于C与UNIX的紧密联系,UNIX系统通常都带有一个C编译器作为程序包的一部分。Linux中同样也包括一个C编译器。个人计算机,包括运行不同版本的 Windows 和 Macintosh 的PC,可使用若干种C编译器。所以不论你使用的是家用计算机,专业工作站还是大型机,都很容易得到针对你特定系统的C编译器。1.2.4 强大的功能和灵活性 C强大而又灵活(计算机世界中经常使用的两个词)。例如,强大而灵活的 UNIX操作系统的大部分便是用C编写的。其他语言(如 FORTRAN,Perl,Python,Pascal,LISP,Logo和BASIC)的许多编译器和解释器也都用C编写的。结果是,当你在一台UNIX机器上使用FORTRAN时,最终是由一个C程序负责生成最后的可执行程序的。C程序已经用于解决物理学和工程学问题,甚至用来为角斗士这样的电影制造特殊效果。1.2.5 面向编程人员 C面向编程人员的需要。它允许你访问硬件,并可以操纵内存中的特定位。它具有丰富的运算符供选择,让你能够简洁地表达自己的意图。在限制你所能做的事情方面,C 不如Pascal这样的语言严格。这种灵活性是优点,同时也是一种危险。优点在于:许多任务(如转换数据形式)在C中都简单得多。危险在于:使用C时,你可能会犯在使用其他一些语言时不可能犯的错误。C给予你更多的自由,但同时也让你承担更大的风险。 另外,多数C实现都有一个大型的库,其中包含有用的C函数。这些函数能够处理编程人员通常会面对的许多需求。1.2.6 C 确实有一些缺点。和人一样,缺点和优点往往是同一特征相对的两个方面。例如,我们前面曾说过,C在表达方面的自由会增加风险,尤其是 C 对指针(在本书后面部分将学到)的使用,意味着你可能会犯非常难以追踪的编程错误。正如以前一位计算机专家曾经指出的,自由的代价是永远的警惕。 C 的简洁性与其丰富的运算符相结合,使其可能会编写出极难理解的代码。没有谁强迫你编写含糊难懂的代码,但存在这样的可能性。试问,除 C 之外还有哪种语言存在一年一度的“含糊代码”(Obfuscated Code)竞赛呢? 此外,C 还有许多的优点,但毫无疑问,C 还有一些缺点。我们不想在这一点上多费笔墨,还是换一个新的话题吧。1.3 C 语言的发展方向 20世纪80年代初,C 在 UNIX系统的小型机世界中已经是主导语言了,从那时开始,它已经扩展到个人计算机(微型机)和大型机(庞然大物), 许多软件开发商都首选 C 语言来开发其子处理程序,电子表格软件,编译器和其他产品。这些公司知道,C 可以产生紧凑而高效的程序。更重要的是,他们知道这些程序易于修改而且易于适应新的计算机模式。 对于公司和熟悉 C 语言的人有益的东西,对其他用户同样有益。越来越多的计算机用户已转身使用 C 以便利用其优点。不一定非得是计算机专业人员才能使用 C 在20世纪90年代,许多软件开发商开始转身使用C+语言来进行大的编程项目。C+向 C 语言嫁接了面向对象编程工具(面向对象编程是一种哲学思想,它试图让语言来适应问题,而不是让问题来适应语言)。C+差不多是 C 的一个超集,意味着任何 C 程序都同时是,或差不多是一个有效的 C+程序。通过学习 C,你还会学习到 C+的许多知识。 不管 C+ 和 Java 这样较新的语言如何流行,C 在软件产业中仍然是一种重要的技能,在最想获得的技能中,它一般都列在前10名。特别是在嵌入式系统的编程中,C 已经开始流行。也就是说,它将用来为汽车,照相机,DVD播放器和其他现代化设备中逐渐普及的微处理器编程。同样,C 已开始进入长期以来一直属于 FORTRAN 的科学编程领域。最后,由于它是一种适合用来开发操作系统的语言,C 在 Linux的开发中也扮演着重要的角色。因此,在21世纪的前10年中,C 仍将保持强劲的势头。 简言之,C 是最重要的编程语言之一,并将继续如此,如果你想找一份编写软件的工作,则首先你应该能够回答“是”的一个问题就是:“请问 ,你会使用C吗?”1.4 计算机工作的基本原理 既然打算学习如何用 C 编程,你就应了解计算机工作原理方面的一些知识。这些知识会帮助你理解用 C 编写程序与运行该程序时最终会发生的事情之间的联系。 现代计算机可分为几个部件。中央处理单元(或称CPU)担负着绝大部分的计算工作,随机访问存储器(或称RAM)作为一个工作区来保存程序和文件;永久存储器,一般是硬盘,即使在计算机关机时也能记下程序和文件;还有各种外围设备(如键盘,鼠标和监视器)用来提供人与计算机之间的通信。CPU负责处理程序,所以我们集中来讨论它的功能。 CPU 的工作非常简单,至少在我们所做的这一简短的描述中是这样的。它从内存中获取一个指令并执行该指令,然后从内存中获取下一个指令并执行,。一个千兆 CPU 可以在一秒种内进行大约一亿次这样的操作,所以 CPU 能以惊人的速度来从事其枯燥的工作。CPU 有自己的小工作区,该工作区由若干个寄存器(registers)组成,每个寄存器可以保存一个数。一个寄存器保存下一条指令的内存地址,CPU 使用该信息获取下一条指令。获取一条指令后,CPU 在另一个寄存器中保存该指令并将第一个寄存器的值更新为下一条指令的地址。CPU 只能理解有限的指令(指令集)。还有,这些指令是相当具体的,其中许多指令要求计算机将一个数从一个位置移动到另一个位置,例如,从内存单元移到寄存器。 这段说明有两个有趣的地方。首先,存储在计算机中的一切内容都是数字。数字是以数字形式存储 的,字符(如文本文档中使用的字母字符)也是以数字形式存储的,每个字符有一个数字代码。计算机装载到寄存器的指令是以数字形式存储的,指令集中的每条指令具有一个数字代码。其次,计算机程序最终必须以这种数字指令代码(或称为机器语言)来表示。 明白了计算机运行方式的一个结果就是:如果你希望计算机做某件事,就必须提供一个特定的指令列表(一套程序)确切地告诉计算机要做的事及如何去做。你必须以一种计算机可以直接理解的语言(机器语言)来创建该程序。这是一项繁琐,乏味,费力的任务。即使将两个想回这样简单的事也必须被分解成若干个步骤:1 将内存单元为2000中的数字复制到寄存器1.2 将内存单元为2004中的数字复制到寄存器2.3 将寄存器2的内容加到寄存器1的内容,答案保留在寄存器1中。4 将寄存器1的内容复制到内存单元2008. 而且你必须用数字代码来表示这些指令中的每一个! 如果你喜欢以这种方式编写程序,那么很不幸,你将会发现机器语言编程的黄金时期已经过去很久了。但如果你喜欢更有乐趣的事,则请向高级编程译文敞开你的心扉。1.5 高级计算机语言和编译器 如 C 这样的高级编程语言,可以从几个方面简化你的编程过程。首先,你不必用数字代码表示指令。其次,你所使用的指令更接近你考虑问题的方式,而非接近计算机使用的详细操作步骤。现在你不用再考虑特定 CPU 实现特定任务所必须采取的精确步骤,而是可以在更抽象的层次上表达你的意图。例如,要对两个数求和,你可以编写下列内容 total = mine + yours; 看到这样的代码,你就会清楚地知道它的作用。但如果看到用数字代码表示的由若干条指令组成的机器语言等价代码,则不会让人这么明白。 不幸的是,对计算机来说正好相反。对计算机来说,高级指令是不能理解的胡言乱语。而这正是出现编译器的原因。编译器是将高级语言程序解释成计算机所需的详细机器语言指令集的程序。你进行高级思考,编译顺则负责乏味的琐碎工作。 采用编译器还有另一个好处。一般来说,每种计算机在设计上都有其自身特有的机器语言。所以用机器语言为一个 InIntel Pentium CPU 编写的程序对 Motorola PowerPC CPU 来说什么都不是。但你可以将编译器匹配一种特定的机器语言。这样,使用正确的编译器或编译器集,你就可以将同一高级语言程序转换为各种不同的机器语言程序。你解决一个编程
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号