C Primer Plus 第五版 中文版(非扫描带书签)1.2.3可移植性C是_种可移植语言。这意味着,在一个系统上编写的C程序经过很少改动或不经修改就可以其他系统上运行。如果修改是必要的,烻通常只须改变伴随主程序的—个头文件中的几项內容即可。多数语言原本都想具有可移植性,但任何曾将 IBM PC BASIC程序转换为 Apple BaSIC程序(它们还是近亲)的人,或者试图在UNⅨX系统上运行一个IBM大型机FORTRAN程序的人都知道,移植至少是在制造麻烦。C在可移植性方面处于领先地位。C编译器(将C代码转换为计算机内部使用的指令的程序)在大约40多种系统上可用,包括从使用8位微处理器的计算机到Craγ超级计算机。不过要知道,程序中为访问特定硬件设备(例如显示器)或操作系统(如 WindowsⅫ或OSⅩ)的特殊功能而专门编写的部分,通常是不能移植的。由于C与UNX的紧密联系,∪NX系统通常都带有一个C编译器作为程序包的一部分。 Linux中同样也包括一个C编译器。个人计算机,包括运行不同版本的 Windows和 Macintosh的PC,可使用若干种C编译器。所以不论你使用的是家用计算机,专业工作站还是大型机,都很容易得到针对你特定系统的C编译器。1.2.4强大的功能和灵活性C强大而又灵活(计算机世界中经常使用的两个词)。例如,强大而灵活的UNX操作系统的大部分便是用C编写的。其他语言(如 FORTRAN,Per, Python, PascalLISP,Logo和 BASIO)的许多编译器和解释器也都用C编写的。结果是,当你在一台UNIX机器上使用 FORTRAN时,最终是由一个C程序负责生成最后的可执行程序的。C程序已经用于解决物理学和工程学问题,甚至用来为《角斗士》这样的刂影制造特殊效果1.25面向编程人员C面向编程人员的需要。它允许你访问硬件,并可以操纵內存中的特定位。它具有丰富的运算符供选择,让你能够简洁地表达自己的意图。在限制你所能做的事情方面,C不如 Pascal这样的语言严格。这种灵活性是优点,同时也是种危险。优点在于:许多任务(如转换数据飛)在C中都简单得多。危险在于:使用C时,你可能会犯在使用其他—些语言时不可能犯的错误。C给予你更多的自由,但同时也让你承担更大的风险。另外,多数C实现都有一个大型的库,其中包含有用的C函数。这些函数能够处理编程人员通常会面对的许多需求。2.6C确实有一些缺点。和人一样,缺点和优点往往是同一特征相对的两个方面。例如,我们前面曾说过,C在表达方面的自由会增加风险,尤其是C对指针(在本书后面部分将学到)的使用,意味着你可能会犯非常难以追踪的编程错误。正如以前一位计算机专家曾经指出的,自由的代价是永远的警惕。C的简洁性与其丰富的运算符相结合,使其可能会编写岀极难瑯解的代码。没有谁强迫你编写含糊难懂的代码,但存在这样的可能性。试问,除C之外还有哪种语言存在一年一度的“含糊代码( obfuscated code)竞赛呢?此外,C还有许多的优点,但毫无疑间,C还有一些缺点。我们不想在这一点上多费笔墨,还是换一个新的话题吧。1.3C语言的发展方向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在Liux的开发中也扮演着重要的角色。因此,在21世纪的前10年中,C仍将保持强劲的势头。简言之,C是最重要的编程语言之一,并将继续如,如果你想找-份编写软件的工作,则首先你应该能够回答“是"的一个问题就是:“请问,你会使用C吗?14计算机工作的基本原理既然打算学习如何用C编程,你就应了解计算机工作原理方面的一些知识。这些知识会帮助你理解用C编写程序与运行该程序时最终会发生的事情之闫的联系。现代计算机可分为几个部件。中央处理单元(或称CPU)担负着绝大部分的计算工作随机访问存储器(或称RAM)作为一个工作区来保存程序和文件;永久存储器,一般是硬盘,即使在计算机关机时也能记下程序和文件;还有各种外围设备(如键盘,鼠标和监视器)用来提供人与计算机之间的通信。CPU负责处理程序,所以我们集中来讨论它的功能。CPU的工作非常简单,至少在我们所做的这一简短的描述中是这样的。它从內存中获取一个指令并执行该指令,然后从内存中获取下一个指令并行,。一个千兆CPU可以在一秒种內进行大约亿次这样的操作,所以CP能以惊人的速度来从事其枯燥的工作。CPU有自己的小工作区,该工作区由若千个青存器( registers)组成,每个寄存器可以保存一个数。一个寄存器保存下一条指令的内存地址,CPU使用该信息获取下一条指令。获取一条指令后,CP在另一个寄存器中保存该指令并将第一个寄存器的值更新为下一条指令的地址。C只能理解有限的指令(指令集)。还有,这些指令是相当具体的,其中许多指令要求计算机将一个数从一个位置移动到另一个位置,例如,从内存单元移到寄存器。这段说明有两个有趣的地方。首先,存储在计算机中的一切内容都是数字。数字是以数字形式存储的,字符(如文本文档中使用的字母字符)也是以数字形式存储的,每个字符有一个数字代码。计算机装载瀏到寄存器的指令是以数字形式存储的,指令集中的每条指令具有一个数字代码。其次,计算机程序最终必须以这种数字指令代码(或称为机器语言)来表示。明白了计算机运行方式的一个结果就是:如果你希望计算机做某件事,就必须提供个特定的指令列表(一套程序)确切地告诉计算机要做的事及如何去做。你必须以种计算机可以直接理解的语言〔机器语言)来创建该程序。这是-项繁琐,乏味,费力的任务。即使将两个想回这样简单的事也必须被分解成若干个步骤1将内存单元为2000中的数好字复伟倒到寄存器1.2将内存单元为2004中的数字复結到寄存器23将寄存器2的内容加到青存器1的内容,答案保留在寄存器1中。4将寄存器1的内容复制到内存单元2008而且你必须用数字代码来表示这些指令中的每一个如果你喜欢以这种方式编写程序,那么很不幸,你将会发现机器语言编程的黄金时期已经过去很久了。但如果你喜欢更有乐趣的事,则请向高级编程译文敞开你的心扉。1.5高级计算机语言和编译器如C这样的高级编程语言,可以从几个方面简化你的编稞程过程。首先,你不必用数字代码表示指令。其次,你所使用的指令更接近你考虑问题的方式,而非接近计算机使用的详细操作步骤。现在你不用再考虑特定C門U实现特定任务所必须采耿的精碥骤,而是可以在更抽象的层次上表达你的意图。侦如,要对两个数求和,你可以编写下列内容total mine t yours;看到这样的代码,你就会凊楚知道它的作用。但如果看到用数字代码表示的由若干条指令组成的机器语言等价代码,则不会让人这么明白。不幸的是,对计算机来说正好相反。对计算机来说,高级指令是不能理解的胡言乱语。而这正是出现编译器的原因。编译器是将高级语言程序解释成计算机所需的详细机器语言指令集的程序。你进行高级思考,编译顺则负责乏味的琐碎工作。采用编译器还有另—一个好处。一般来说,每种计算机在设计上都有其自身特有的机器语言。所以用机器语言为一个InIntel pentium cpu编写的程序对 Motorola powerpc cpu来说什么都不是。但你可以将编译器匹配_种特定的杋器语言。这样,使用正确的编译器或缔译器集,你就可以将同一高级语言程序转换为各种不同的机器语言程序。你解决一个编程问题只须一次,然后可以让编译器将该解决方案解释为各种机器语言。简言之,高级语言(如C,J阳a和 Pascal)都以更抽象的方式描述动作,并且没有与特定的CPu或指令集相关联。同样,高级语言更易于学习,而且用高级语言编写程序比用机器语言容易得多。16使用C语言的7个步骤正如你所看到的,C是种编译性语言。如果你习惯于使用编译性语言,如 Pascal或陌 ORTRAN,你会熟悉建立C程序的基本步骤。然而,如果你的背景是解释性语言(例如 BASIC),或面向图形界面的语言(例如 Visual bas),或者你本没有任何背景,则需要学如何进行编译。我们很快就会看到这个过程,你会看到该过程直接了当而且容易理解。首先,为了让你对编程有一个概括了解,我们将编写C程序的过程分解为7个步骤1。定义程序目标2.设计程序3.编写代码4.编译5.运行程序6.测试和调试程序7.维护和修改程序注意,这是理想化的。在实践中,是在较大的项目中,你可能需要做一些反复工作用后一步驟所了解到的內容来改进前一个步骤聚。1.6.1第1步:定义程序目标非常自然地,在开始时,你应对希望程序做什么有一个清晰的想法。考虑程序需要的信息,程序需要进行的计算和操作,以及程序应该向你报告的信息。在这一规划阶段你应该用一般概念来考虑问题,而不是一些具体的计算机语言术语来考虑。16.2第2步:设计程序在对程序应该完成的事情有一个概念性的认识后,你就应该决定程序是如何完成它,用户界面应该是怎么样的,程序应该如何组织,目标用户是谁,你有多长时间来完成这个程序?你还需要确定在程序中(而且还可能在辅助文件中)如何表示数据,以及用什么方法来处理数据。你开始学习C编程时,选择将是简单的,但当你处理复杂的情况时,你会发现这些决策需要更多的思考。选择一个好的方式来表示信息通常可以使程序和数据处理容易得多。