C语言chap1 C语言程序设计的概念_第1页
C语言chap1 C语言程序设计的概念_第2页
C语言chap1 C语言程序设计的概念_第3页
C语言chap1 C语言程序设计的概念_第4页
C语言chap1 C语言程序设计的概念_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 1.1.1 计算机与程序计算机与程序一提起计算机,人们就会联想到键盘、显示器和主机。一提起计算机,人们就会联想到键盘、显示器和主机。其实,应用要早得多、并一直流传至今的计算机工具是算其实,应用要早得多、并一直流传至今的计算机工具是算盘(见图盘(见图1.1)。那么,现代电子计算机与算盘的最大区别)。那么,现代电子计算机与算盘的最大区别在哪里呢?关键在于现代计算机可以自动完成计算过程,在哪里呢?关键在于现代计算机可以自动完成计算过程,而算盘进行的计算过程是在人的拨动下才能进行。而算盘进行的计算过程是在人的拨动下才能进行。 图图1.1 算盘算盘那么,为什么现代计算机可以自动完成计算过程呢?那么,为

2、什么现代计算机可以自动完成计算过程呢?这这 首先要从程序说起。程序实际上是一个非常首先要从程序说起。程序实际上是一个非常普通的概念:按照一定的顺序安排的工作步骤。可普通的概念:按照一定的顺序安排的工作步骤。可以说,做任何事情都有相应的程序。做的事情不同,以说,做任何事情都有相应的程序。做的事情不同,要求的效果不同,程序就不同。例如,用同样的原要求的效果不同,程序就不同。例如,用同样的原料,采用不同的程序,会做出不同的菜肴来。料,采用不同的程序,会做出不同的菜肴来。一种工具能够自动工作,一是要有记忆功能,能够一种工具能够自动工作,一是要有记忆功能,能够记住程序;二是具有按照程序控制相关部件操作的

3、记住程序;二是具有按照程序控制相关部件操作的能力。如果能让算盘记住做某种计算的口诀和计算能力。如果能让算盘记住做某种计算的口诀和计算的数据,并且有能按照口诀控制算珠自动运动的机的数据,并且有能按照口诀控制算珠自动运动的机制,则只要发出开始执行的命令,算盘就会自动完制,则只要发出开始执行的命令,算盘就会自动完成计算。成计算。可惜这样的机制并没有在算盘中实现。但是,却有可惜这样的机制并没有在算盘中实现。但是,却有另外一种机器却在这方面向前推进了一步。这就是另外一种机器却在这方面向前推进了一步。这就是明朝末年宋应星在其明朝末年宋应星在其天工开物天工开物中记载的中国古中记载的中国古代提花机(见图代提花

4、机(见图1.2)。)。图图1.2 中国古代的提花机中国古代的提花机中国提花机大约出现于西汉末年(公元前)。它采用用中国提花机大约出现于西汉末年(公元前)。它采用用丝线结成的丝线结成的“花本花本”(花版)控制经线起落,以织成要(花版)控制经线起落,以织成要求的图样。这是最早的程序控制思想。后来,提花机沿求的图样。这是最早的程序控制思想。后来,提花机沿着丝绸之路传到欧洲,历经改进,着丝绸之路传到欧洲,历经改进,1805年法国人年法国人Joseph Jacquard制造成功用穿孔卡片(见图制造成功用穿孔卡片(见图1.3)控)控制连杆(横针)制连杆(横针),用有孔和无孔进一步控制经线起落的提用有孔和无

5、孔进一步控制经线起落的提花机。花机。图图1.3 穿孔卡片穿孔卡片 穿孔卡片把程序控制技术向前推进了一步。这一技术被一穿孔卡片把程序控制技术向前推进了一步。这一技术被一位英国数学家位英国数学家Charles Babbage(见图(见图1.4)引入到了计)引入到了计算机中机,用有孔和无孔的组合来表示数据和程序。算机中机,用有孔和无孔的组合来表示数据和程序。图图1.4 英国数学家英国数学家Charles Babbage 18世纪末,法国数学界调集大批数学家,组成了人工手世纪末,法国数学界调集大批数学家,组成了人工手算的流水线,经过长期艰苦奋斗,终于完成了算的流水线,经过长期艰苦奋斗,终于完成了17卷

6、卷数数学用表学用表的编制,但是,手工计算出的数据出现了大量的编制,但是,手工计算出的数据出现了大量错误。这件事情强烈刺激了错误。这件事情强烈刺激了Babbage。1812年年20岁的岁的Babbage开始计算机的研制工作,他要把函数表的复杂开始计算机的研制工作,他要把函数表的复杂算式转化为差分运算,用简单的加法代替平方运算,快算式转化为差分运算,用简单的加法代替平方运算,快速编制不同函数的数学用表,并将这种机器称为速编制不同函数的数学用表,并将这种机器称为“差分差分机机”。经过十年的努力,终于于。经过十年的努力,终于于1822年完成了第一台差年完成了第一台差分机,可以处理分机,可以处理3个不同

7、的个不同的5位数,计算精度达到位数,计算精度达到6位小位小数。数。1833年他又开始投身于一种年他又开始投身于一种“会分析的机器会分析的机器”分析机的研制中。他把机器设计成三个部分,一是用来分析机的研制中。他把机器设计成三个部分,一是用来储存数据信息的储存数据信息的“仓库(仓库(The Store)”,二是进行数,二是进行数据运算处理的据运算处理的“工场(工场(The mill)”,三是使用穿孔卡,三是使用穿孔卡片来输入程序并用穿孔卡片输出数据。片来输入程序并用穿孔卡片输出数据。这台机器虽然没有制造成功,但它的工作原理这台机器虽然没有制造成功,但它的工作原理程序程序存储控制为今天的计算机奠定了

8、基础:存储控制为今天的计算机奠定了基础:(1)任何工具的工作,都是由程序控制的;)任何工具的工作,都是由程序控制的;(2)只有工具具有了记忆程序的功能,并具有了按照)只有工具具有了记忆程序的功能,并具有了按照程序进行自我控制的功能,该工具才能自动工作。程序进行自我控制的功能,该工具才能自动工作。 1.1.2 计算机程序设计语言计算机程序设计语言程序要需要用某种形式(语言)来描述。例如,用算盘进行计程序要需要用某种形式(语言)来描述。例如,用算盘进行计算,程序是用口诀描述的,珠算的语言是口诀。现代计算机的算,程序是用口诀描述的,珠算的语言是口诀。现代计算机的程序则是用计算机程序设计语言来描述的。

9、从计算机诞生到今程序则是用计算机程序设计语言来描述的。从计算机诞生到今天,程序设计语言也在伴着计算机技术的进步不断升级换代。天,程序设计语言也在伴着计算机技术的进步不断升级换代。1. 机器语言机器语言一种一种CPU的指令系统,也称该的指令系统,也称该CPU的机器语言,它是该的机器语言,它是该CPU可可以识别的一组由以识别的一组由0和和1序列构成的指令码。下面是某序列构成的指令码。下面是某CPU指令系指令系统中的两条指令:统中的两条指令: 1 0 0 0 0 0 0 0 (进行一次加法运算)(进行一次加法运算)1 0 0 1 0 0 0 0 (进行一次减法运算)(进行一次减法运算) 用机器语言编

10、程序,就是从所使用的用机器语言编程序,就是从所使用的CPU的指令系统中挑选合的指令系统中挑选合适的指令,组成一个指令系列。这种程序虽然可以被机器直接适的指令,组成一个指令系列。这种程序虽然可以被机器直接理解和执行,却由于它们不直观,难记、难认、难理解、不易理解和执行,却由于它们不直观,难记、难认、难理解、不易查错,只能被少数专业人员掌握,同时编写程序的效率很低,查错,只能被少数专业人员掌握,同时编写程序的效率很低,质量难以保证。这种繁重的手工方式与高速、自动工作的计算质量难以保证。这种繁重的手工方式与高速、自动工作的计算机极不相称。这种方式仅使用于计算机出现的初期机极不相称。这种方式仅使用于计

11、算机出现的初期(使用穿孔纸使用穿孔纸带的时期带的时期)的编程(用有孔、无孔,分别代表的编程(用有孔、无孔,分别代表1、0),现在已),现在已经不再使用经不再使用 2. 汇编语言汇编语言为减轻人们在编程中的劳动强度,为减轻人们在编程中的劳动强度,20世纪世纪50年代中期人们年代中期人们开始用一些开始用一些“助记符号助记符号”来代替来代替0,1码编程。如前面的两条码编程。如前面的两条机器指令可以写为机器指令可以写为A+B A或或ADD A,BA-B 个样个样 A或或SUB A,B这种用助记符号描述的指令系统,称为符号语言或汇编语言。这种用助记符号描述的指令系统,称为符号语言或汇编语言。用汇编语言编

12、程,程序的生产效率及质量都有所提高。但是用汇编语言编程,程序的生产效率及质量都有所提高。但是汇编语言指令是机器不能直接识别、理解和执行的。用它编汇编语言指令是机器不能直接识别、理解和执行的。用它编写的程序经检查无误后,要先翻译成机器语言程序才能被机写的程序经检查无误后,要先翻译成机器语言程序才能被机器理解、执行。这个翻译转换过程称为器理解、执行。这个翻译转换过程称为“代真代真”。代真后得。代真后得到的机器语言程序称为目标程序到的机器语言程序称为目标程序(object program),代真以,代真以前的程序,称为源程序前的程序,称为源程序(source program)。由于汇编语言。由于汇编

13、语言指令与机器语言指令基本上具有一一对应的关系,所以汇编指令与机器语言指令基本上具有一一对应的关系,所以汇编语言源程序的代真可以由汇编系统以查表的方式进行。语言源程序的代真可以由汇编系统以查表的方式进行。汇编语言与机器语言,都是依汇编语言与机器语言,都是依CPU的不同而异,它们都称为的不同而异,它们都称为面向机器的语言。用面向机器的语言编程,可以编出效率极面向机器的语言。用面向机器的语言编程,可以编出效率极高的程序。但是程序员用它们编程时,不仅要考虑解题思路,高的程序。但是程序员用它们编程时,不仅要考虑解题思路,还要熟悉机器的内部结构,并且要还要熟悉机器的内部结构,并且要“手工手工”地进行存储

14、器分地进行存储器分配。这种编程的劳动强度仍然很大,给计算机的普及推广造配。这种编程的劳动强度仍然很大,给计算机的普及推广造成很大的障碍。成很大的障碍。 2. 高级语言高级语言汇编语言和机器语言是面向机器的,不同类型的计算汇编语言和机器语言是面向机器的,不同类型的计算机所用的汇编语言和机器语言是不同的。机所用的汇编语言和机器语言是不同的。1954年出现年出现的的FORTRAN语言以及随后相继出现的其它高级语言,语言以及随后相继出现的其它高级语言,开始使用接近人类自然语言的、但又消除了自然语言开始使用接近人类自然语言的、但又消除了自然语言中的二义性的语言来描述程序。这些高级语言使人们中的二义性的语

15、言来描述程序。这些高级语言使人们开始摆脱进行程序设计必须先熟悉机器的桎梏,把精开始摆脱进行程序设计必须先熟悉机器的桎梏,把精力集中于解题思路和方法上。力集中于解题思路和方法上。第一种高级语言是第一种高级语言是1954年问世的年问世的FORTRAN语言。此语言。此后不久,不同风格、不同用途、不同规模、不同版本后不久,不同风格、不同用途、不同规模、不同版本的面向过程的高级语言便风涌而起。据统计,全世界的面向过程的高级语言便风涌而起。据统计,全世界已有已有2500种以上的计算机语言,其中使用较多的有近种以上的计算机语言,其中使用较多的有近百种。图百种。图1.5为几种广泛流行的高级语言的发展变迁情为几

16、种广泛流行的高级语言的发展变迁情况。况。 20042000199619921988198419801976197219681964196019561952JavaC+CPLBCPLBCPASCALModula-2AdaALGOL68ALGOL60FORTRANBASICQBASICVisual BASICFORTRAN 77FORTRAN 90PL/1LISPPROLOGCOBOLSimula 67Smalltalk 80C89C99C#图图1.5 几种广泛流行的高级语言的发展变迁情况几种广泛流行的高级语言的发展变迁情况1.1.3 高级语言程序的开发过程高级语言程序的开发过程一般来说,程序开发

17、的一般过程有如图一般来说,程序开发的一般过程有如图1.6所示几个所示几个步骤。步骤。提 出 问 题分析问题建立模型表 现 模 型编辑源程序编 译链 接测试与调试编写程序文档错 误目标文件可执行文件未发现错误源程序文件源程序代码模型问题编辑错误建模错误分析错误不再适宜运 行 维 护交付使用图图1.6 高级语言程序的开发过程高级语言程序的开发过程1. 分析分析一般来说,一个具体的问题要涉及许许多多的方面,一般来说,一个具体的问题要涉及许许多多的方面,这是问题的复杂性所在。为了便于求解,往往要忽这是问题的复杂性所在。为了便于求解,往往要忽略一些次要方面。这种通过忽略次要方面,而找出略一些次要方面。这

18、种通过忽略次要方面,而找出解题规律,就称为建立模型。解题规律,就称为建立模型。2. 建立模型,表现模型建立模型,表现模型表现模型就是用一种符号表现模型就是用一种符号-语言系统来描述模型。语言系统来描述模型。一般来说,模型的表现会随着对问题抽象程度的加一般来说,模型的表现会随着对问题抽象程度的加深和细化,不断由领域特色向计算机可解释、执行深和细化,不断由领域特色向计算机可解释、执行靠近,中间也可能采用一些其他的符号系统,如流靠近,中间也可能采用一些其他的符号系统,如流程图等,直到最后用一种计算机程序设计语言描述程图等,直到最后用一种计算机程序设计语言描述出来。出来。3. 源程序的编辑源程序的编辑

19、源程序的编辑就是在某种字处理环境下,用具体的源程序的编辑就是在某种字处理环境下,用具体的程序设计语言书写并修改的过程。为此就要掌握一程序设计语言书写并修改的过程。为此就要掌握一种计算机程序设计语言。还要应用一种专用程序编种计算机程序设计语言。还要应用一种专用程序编辑器或通用的文字编辑器进行。辑器或通用的文字编辑器进行。 4. 程序的编译(或解释)与链接程序的编译(或解释)与链接写出一个高级语言程序后,并不是就可以立即拿来执行。写出一个高级语言程序后,并不是就可以立即拿来执行。要让机器直接执行,还要将它翻译成由机器可以直接辨要让机器直接执行,还要将它翻译成由机器可以直接辨认并可以执行的机器语言程

20、序。为区别它们,把用高级认并可以执行的机器语言程序。为区别它们,把用高级语言写的程序(文件)称为源程序(文件),把机器可语言写的程序(文件)称为源程序(文件),把机器可以直接辨认并执行的程序(文件)称为可执行程序(文以直接辨认并执行的程序(文件)称为可执行程序(文件)。这一过程一般分为两步:件)。这一过程一般分为两步:第第1步步:在程序编辑过程中输入到源文件中的是一些字:在程序编辑过程中输入到源文件中的是一些字符码,但是机器可以直接处理的是符码,但是机器可以直接处理的是0、1信息。为此,首信息。为此,首先要将源程序文件翻译成先要将源程序文件翻译成0、1码表示的信息,并用相应码表示的信息,并用相

21、应的文件保存。这种保存的文件保存。这种保存0、1码信息的文件称为目标程序码信息的文件称为目标程序文件。由源文件翻译成目标文件的过程称为编译。在编文件。由源文件翻译成目标文件的过程称为编译。在编译过程中,还要对源程序中的语法和逻辑结构进行检查。译过程中,还要对源程序中的语法和逻辑结构进行检查。编译任务是由称做编译器(编译任务是由称做编译器(compiler)的软件完成的。)的软件完成的。目标程序文件还不能被执行,它们只是一些目标程序模目标程序文件还不能被执行,它们只是一些目标程序模块。块。第第2步步:将目标程序模块以及程序所需的系统中固有的:将目标程序模块以及程序所需的系统中固有的目标程序模块(

22、如执行输入输出操作的模块)链接成一目标程序模块(如执行输入输出操作的模块)链接成一个完整的程序。经正确链接所生成的文件才是可执行文个完整的程序。经正确链接所生成的文件才是可执行文件。完成链接过程的软件称为链接器(件。完成链接过程的软件称为链接器(linker)。)。图图1.7为编译和链接过程的示意图。为编译和链接过程的示意图。程序在编译、链接过程中,也可能发现错误。这时要重程序在编译、链接过程中,也可能发现错误。这时要重新进入编辑器进行编辑。新进入编辑器进行编辑。# include int add (int ,int );int main (void)int s;s = add(2,3);pr

23、intf(“The sum is:%d”, s);return 0;int add (int a,int b)int sum;sum = a + b;return sum;编译器0101100101110101101010001010001000110010101111010001000101000100011001010111101000100111011101链接程序源文件1源文件2目标文件1目标文件2110001101011100010100010001100101011110100010011101110110010010010000000000可执行文件100010001010001

24、00011001010111101000100111011101100110011其他目标文件图图1.7 编译和链接过程的示意图编译和链接过程的示意图5. 程序的测试与调试程序的测试与调试经编译、链接的程序文件,生成可执行文件,就可以让经编译、链接的程序文件,生成可执行文件,就可以让计算机执行了。但是,并不是就可以得到预期的结果而计算机执行了。但是,并不是就可以得到预期的结果而交付用户使用了,因为程序仍然会存在某些错误。因此,交付用户使用了,因为程序仍然会存在某些错误。因此,每一个人编写出一个程序后,在正式交付使用前,总要每一个人编写出一个程序后,在正式交付使用前,总要试通一下。试通一下。“试

25、通试通”就是试运行程序,也就是对程序进就是试运行程序,也就是对程序进行测试。行测试。测试是以程序通过编译、没有语法和链接上的错误为前测试是以程序通过编译、没有语法和链接上的错误为前提,目的是找出程序中可能存在的错误并加以改正。因提,目的是找出程序中可能存在的错误并加以改正。因此,应该测试程序在不同情况下运行的情况,输入不同此,应该测试程序在不同情况下运行的情况,输入不同的数据可以检测出程序在不同情况下运行的情况。测试的数据可以检测出程序在不同情况下运行的情况。测试的数据应是以的数据应是以“程序是会有错误的程序是会有错误的”为前提精心设计出为前提精心设计出来的,而不是随心所欲地乱凑而成的。它不仅

26、应含有被来的,而不是随心所欲地乱凑而成的。它不仅应含有被测程序的输入数据,而且还应包括程序执行它们后预期测程序的输入数据,而且还应包括程序执行它们后预期的结果。每次测试都要把实际的结果与预期的结果相比的结果。每次测试都要把实际的结果与预期的结果相比较,以观察程序是否出错。较,以观察程序是否出错。6. 编写程序文档编写程序文档经过了问题分析、设计、程序编码、测试后,程序开发经过了问题分析、设计、程序编码、测试后,程序开发的工作基本上结束了。但是,这时还不能交付使用。因的工作基本上结束了。但是,这时还不能交付使用。因为,随着程序规模的增大和日益复杂化,程序的使用和为,随着程序规模的增大和日益复杂化

27、,程序的使用和运行也越来越不那么直接,用户要运行程序,还需要知运行也越来越不那么直接,用户要运行程序,还需要知道许多信息,如:道许多信息,如:程序的功能程序的功能需要输入的数据类型、格式和取值范围需要输入的数据类型、格式和取值范围需要使用的文件数量、名称、内容以及存放位置等需要使用的文件数量、名称、内容以及存放位置等程序运行需要的软、硬件环境程序运行需要的软、硬件环境程序的装入、启动方法以及交互方式等程序的装入、启动方法以及交互方式等。为此,程序开发者需要向用户提供这些资料为此,程序开发者需要向用户提供这些资料称为程称为程序使用说明书或用户文档。需要说明的是,在许多软件序使用说明书或用户文档。

28、需要说明的是,在许多软件中,这些内容已经部分或全部地以中,这些内容已经部分或全部地以“readme”或或“help”的形式提供。的形式提供。目前,程序文档已经成为软件开发产品的必要部分。文目前,程序文档已经成为软件开发产品的必要部分。文档在程序使用和维护中的重要性也改变了软件的概念,档在程序使用和维护中的重要性也改变了软件的概念,使之由早期的使之由早期的“软件是计算机程序的总称软件是计算机程序的总称”演化为演化为“软软件是计算机的程序连同计算机化的文档的总称。件是计算机的程序连同计算机化的文档的总称。”7. 程序的维护程序的维护程序交付用户使用之后,并不是万事大吉了。由于程序交付用户使用之后,

29、并不是万事大吉了。由于多种原因,还可能要对程序进行修改。交付之后对多种原因,还可能要对程序进行修改。交付之后对程序的修改称为程序的维护。维护程序的原因主要程序的修改称为程序的维护。维护程序的原因主要有:有:原来的程序没有完全满足用户要求;原来的程序没有完全满足用户要求;用户要求的改变;用户要求的改变;程序中遗留有错误,在运行中被发现。程序中遗留有错误,在运行中被发现。程序的维护可以由开发者进行,也可能是由别人进程序的维护可以由开发者进行,也可能是由别人进行。为能便于程序的维护,开发者应当提供必要的行。为能便于程序的维护,开发者应当提供必要的技术资料,并且要保证程序的可读性好技术资料,并且要保证

30、程序的可读性好能让人能让人看懂。看懂。1.2.1 C语言的出现语言的出现 C语言是目前程序设计领域中最有影响力的一种程语言是目前程序设计领域中最有影响力的一种程 序设计语言。可是,它却是序设计语言。可是,它却是“漫不经心漫不经心”地开发出地开发出来的。来的。 20世纪世纪60年代,年代,Bell实验室的实验室的Ken Thompson (见图(见图1.8)着手开发后来对计算机产生了巨大影)着手开发后来对计算机产生了巨大影响的响的UNIX操作系统。为了描述操作系统。为了描述UNIX,Thompson首先将当时的一种专门用来描述系统程序的首先将当时的一种专门用来描述系统程序的BCPL语言改进为他称

31、为语言改进为他称为B的语言。的语言。1970年年Thompson发发表了用汇编语言和表了用汇编语言和B语言写成的语言写成的PDP-7上实现上实现UNIX的初版。的初版。1971年,年,Dennis Ritchie(见图(见图1.8)开始协助)开始协助Thompson开发开发UNIX。他对。他对B语言做了进一步的充实和语言做了进一步的充实和完善,加入数据类型和新的句法,于完善,加入数据类型和新的句法,于1972年推出了一种年推出了一种新型程序设计语言新型程序设计语言C语言(取语言(取BCPL的第的第2个字母)。个字母)。为了使为了使UNIX操作系统推广,操作系统推广,1977年年Dennis M

32、.Ritchie 发表了不依赖于具体机器系统的发表了不依赖于具体机器系统的C语言编译文本语言编译文本可移可移植的植的C语言编译程序语言编译程序。于是,。于是,C语言是借助语言是借助UNIX操作操作系统的翅膀而起飞的,系统的翅膀而起飞的,UNIX操作系统也由于操作系统也由于C而得已快而得已快速移植落地生根,两者相辅相承,成就了软件开发史上速移植落地生根,两者相辅相承,成就了软件开发史上历时历时30年的时代。年的时代。图图1.8 Thompson(左)和(左)和Ritchie(中)于(中)于1999 年接受当时美国总统克林顿授予的国家技术勋章年接受当时美国总统克林顿授予的国家技术勋章1971年,年

33、,Dennis Ritchie(见图(见图1.8)开始协助)开始协助Thompson开发开发UNIX。他对。他对B语言做了进一步的充实和语言做了进一步的充实和完善,加入数据类型和新的句法,于完善,加入数据类型和新的句法,于1972年推出了一种年推出了一种新型程序设计语言新型程序设计语言C语言(取语言(取BCPL的第的第2个字母)。个字母)。为了使为了使UNIX操作系统推广,操作系统推广,1977年年Dennis M.Ritchie 发表了不依赖于具体机器系统的发表了不依赖于具体机器系统的C语言编译文本语言编译文本可移可移植的植的C语言编译程序语言编译程序。于是,。于是,C语言是借助语言是借助U

34、NIX操作操作系统的翅膀而起飞的,系统的翅膀而起飞的,UNIX操作系统也由于操作系统也由于C而得已快而得已快速移植落地生根,两者相辅相承,成就了软件开发史上速移植落地生根,两者相辅相承,成就了软件开发史上历时历时30年的时代。年的时代。图图1.8 Thompson(左)和(左)和Ritchie(中)于(中)于1999 年接受当时美国总统克林顿授予的国家技术勋章年接受当时美国总统克林顿授予的国家技术勋章1978年年Brian W.Kernighian和和Dennis M.Ritchie出版了名著出版了名著The C Programming Language,从而使从而使C语言成为目前世界上流行最

35、广泛的高级程语言成为目前世界上流行最广泛的高级程序设计语言。以后,又有多种程序设计语言在序设计语言。以后,又有多种程序设计语言在C语语言的基础上产生,如言的基础上产生,如C+、Visual C+、Java、C#等。等。1.2.2 C语言的标准语言的标准C语言的灵活性、丰富性、可移植性很快得到了普遍的承认,语言的灵活性、丰富性、可移植性很快得到了普遍的承认,接着适合于各种不同操作系统接着适合于各种不同操作系统(UNIX,MS-DOS,CP/M-80,86等等)和不同机种和不同机种(字长为字长为8bit32bit)的的C语言编译系统相继出语言编译系统相继出现。现。1982年美国国家标准局年美国国家

36、标准局(ANSI)语言标准化委员会成立了一语言标准化委员会成立了一个委员会开始着手进行个委员会开始着手进行C语言的标准化工作,并于语言的标准化工作,并于1983年公布年公布了第一个了第一个C语言标准草案语言标准草案(83 ANSI C)。1989年,年,ASNI又发布又发布了一个完整的了一个完整的C语言标准语言标准ANSI X3.159-1989,通常称做,通常称做“ANSI C”,简称,简称“C89”。1990年,国际标准组织年,国际标准组织ISO/JEC JTC1/SC22/WG14采纳了采纳了C89,做了少编辑性修改后,以国际,做了少编辑性修改后,以国际标准标准ISO/IEC 9899:

37、1990发布,通常称其为发布,通常称其为 “C90”,它同,它同C89基本相同。基本相同。1995年,年,WG14对对C89做了两处技术修订和一个扩充。人们将做了两处技术修订和一个扩充。人们将其称为其称为“C89增补增补1”或或“C95”。同时,。同时,WG14开始着手对开始着手对C标标准做全面修订,并于准做全面修订,并于1999年完成获得通过,形成正式的年完成获得通过,形成正式的C语言语言标准,命名为标准,命名为ISO/IEC 9899:1999,简称,简称“C99”。本书将基于本书将基于C99介绍介绍C 语言程序设计的基本方法。目前各厂家语言程序设计的基本方法。目前各厂家所提供的所有所提供

38、的所有C编译系统都还未实现编译系统都还未实现C99所建议的功能。为了所建议的功能。为了读者能实际运行读者能实际运行C程序,本书所介绍的程序都是符合程序,本书所介绍的程序都是符合ASNI C标标准并能在大多数准并能在大多数C编译系统通过和运行的程序。但在文字叙述编译系统通过和运行的程序。但在文字叙述中,会介绍中,会介绍C99所增加的新功能,以使读者今后能顺利地过渡所增加的新功能,以使读者今后能顺利地过渡到用到用C99编程。编程。1.3.1 函数函数任何一部机器都是用部件组装而成的。计算机程序和机器任何一部机器都是用部件组装而成的。计算机程序和机器一样,也是由一些部件构建起来的。一样,也是由一些部

39、件构建起来的。C语言程序部件是函数。语言程序部件是函数。也就是说,设计也就是说,设计C语言程序就是设计它的构成函数。语言程序就是设计它的构成函数。下面举例说明下面举例说明C语言程序中的函数是什么样的。语言程序中的函数是什么样的。例例1.1 一个输出一串字符的一个输出一串字符的C程序程序。/* 文件名:文件名:ex010101.c */# include int main(void)printf(Programming is fun.); /* 输出一串字符输出一串字符 */return 0;/* 向操作系统向操作系统返回一个数字返回一个数字0*/这是一个非常简单的这是一个非常简单的C语言程序,

40、它的执行结果是显示一语言程序,它的执行结果是显示一行字符:行字符: Programming is fun.说明:说明:(1)这里)这里 是一个函数。这个函数的名字为是一个函数。这个函数的名字为“main”。这个名字是专。这个名字是专用的,表示这个函数是用的,表示这个函数是“主函数主函数”。所谓主函数,就是。所谓主函数,就是执行这个程序时,由操作系统直接调用的函数。每一个执行这个程序时,由操作系统直接调用的函数。每一个C语言程序必须也只能有一个主函数。语言程序必须也只能有一个主函数。 int main (void)(2)函数名后面的圆括号用于表示参数。一般说来,用)函数名后面的圆括号用于表示参数

41、。一般说来,用函数进行计算,需要给定参数。但是广义的计算也可以函数进行计算,需要给定参数。但是广义的计算也可以没有参数而只执行一个过程。在没有参数而只执行一个过程。在C语言程序中,参数部分语言程序中,参数部分写为写为“void”,表示该函数没有参数,只执行一个过程。,表示该函数没有参数,只执行一个过程。“void”可以省写,如程序第一行可写为:可以省写,如程序第一行可写为: int main() 在许多教材和程序中,可以常常见到这种形式的主函数在许多教材和程序中,可以常常见到这种形式的主函数首行。但是,首行。但是,C标准建议写上标准建议写上void,使含义清晰。在本书,使含义清晰。在本书的程序

42、中都是写成的程序中都是写成main(void) 形式的。形式的。 (3)再后面的一对花括号中的部分称为函数体,用来表)再后面的一对花括号中的部分称为函数体,用来表明该函数的功能是如何实现的。通常,函数体用一些语明该函数的功能是如何实现的。通常,函数体用一些语句表述。句表述。C语言规定语句必须用分号结束。先分析下面的语言规定语句必须用分号结束。先分析下面的语句:语句: printf(Programming is fun.); 它的功能是调用编译系统提供的函数库中的一个函数它的功能是调用编译系统提供的函数库中的一个函数printf(),来输出后面的一串字符。函数(),来输出后面的一串字符。函数pr

43、intf的使用的使用比较复杂,后面将陆续介绍。比较复杂,后面将陆续介绍。 (4)函数名前面的)函数名前面的“int”表明函数的返回值是一个整数。表明函数的返回值是一个整数。有的操作系统有的操作系统(如如Unix)要求在执行一个程序后应向系统返要求在执行一个程序后应向系统返回一个整数值,如程序正常执行和结束,应返回回一个整数值,如程序正常执行和结束,应返回0,否则,否则返回一个非返回一个非0值。因此,需要将值。因此,需要将main函数指定为函数指定为int(整型整型),同时在函数体的最后写一返回语句:同时在函数体的最后写一返回语句: return 0; 它的功能是向调用者它的功能是向调用者(操作

44、系统操作系统)返回返回0值,表示主函数正值,表示主函数正常结束常结束(也就是程序正常结束也就是程序正常结束)。此语句必须写在函数体的。此语句必须写在函数体的最后一行才有意义,因为只要执行到这条语句,就表达最后一行才有意义,因为只要执行到这条语句,就表达程序正常结束,向操作系统返回一个程序正常结束,向操作系统返回一个0,如果程序未执行,如果程序未执行到这个返回语句就非正常结束了,就不会向操作系统返到这个返回语句就非正常结束了,就不会向操作系统返回回0。操作系统会据此作出相应的处理。操作系统会据此作出相应的处理。有的操作系统有的操作系统(如如DOS,Windows)并无程序必须返回整并无程序必须返

45、回整数的要求,因此,可以不指定数的要求,因此,可以不指定main函数为整型。这时可函数为整型。这时可在在main函数的前面加上函数的前面加上void,如,如 void main(void) 或或 void main() 表示表示main函数是无类型的,不返回任何类型的值。显然函数是无类型的,不返回任何类型的值。显然在在main函数的最后也不必写返回语句函数的最后也不必写返回语句“return 0;”。读者。读者可以在其他教材或程序中看到这种形式的可以在其他教材或程序中看到这种形式的main函数。函数。以上两种用法都是是合法的、有效的,编程者可以根据以上两种用法都是是合法的、有效的,编程者可以根

46、据情况决定。为了使程序具有一般性,采用以下形式情况决定。为了使程序具有一般性,采用以下形式 int main(void) 并在函数体最后有并在函数体最后有“return 0;”语句。语句。(5)程序最前面的)程序最前面的 # include 是一种在程序编译之前要处理的内容,称为编译预处理是一种在程序编译之前要处理的内容,称为编译预处理命令。编译预处理命令还有一些,它们都用命令。编译预处理命令还有一些,它们都用“#”开头,开头,并且不用分号结束,所以不是并且不用分号结束,所以不是C语言的语句。这里的编译语言的语句。这里的编译预处理命令称为文件包含命令,它的作用是在编译之前预处理命令称为文件包含

47、命令,它的作用是在编译之前把程序中需要使用关于系统定义的函数把程序中需要使用关于系统定义的函数printf()的一些()的一些信息文件信息文件stdio.h包含进来。用包含进来。用“.h”作为后缀的文件称为作为后缀的文件称为头文件。头文件。(6)“/* */”中的文字用于做一些说明中的文字用于做一些说明注释,让注释,让读程序的人容易读懂。例如,注释读程序的人容易读懂。例如,注释 /* 文件名:文件名:ex1_01.c */ 是告诉读程序的人,这个程序的源代码用文件是告诉读程序的人,这个程序的源代码用文件ex1_01保保存。而其他两个注释是对其左面两条语句功能的说明。存。而其他两个注释是对其左面

48、两条语句功能的说明。 上面的程序只由一个函数组成上面的程序只由一个函数组成(在主函数中又调用了库函在主函数中又调用了库函数数printf()。在例。在例1.2中将介绍由两个函数组成的程序。中将介绍由两个函数组成的程序。例例1.2 计算两个整数(计算两个整数(2,3)相加的结果)相加的结果/* 文件名:文件名:ex010201.c */# include int add (int ,int );/* 声明后面将要使用函数声明后面将要使用函数add()()*/int main (void)int s;/* 声明后面使用的变量声明后面使用的变量s是整型的是整型的*/s = add(2,3);/* 调

49、用调用add()进行计算,并用()进行计算,并用s接收接收*/printf(“The sum is:%d”, s); /* 输出输出s的值的值*/return 0;int add (int a,int b)/* 函数函数add()的定义()的定义*/int sum;/* 定义一个整数定义一个整数sum,用于存放和,用于存放和*/sum = a + b;/* 将将a和和b求和,并把结果送求和,并把结果送sum*/return sum;/* 返回返回sum的值到调用者的值到调用者*/说明说明(1)图)图1.9表明了该程序的执行过程。为了清晰,仅列表明了该程序的执行过程。为了清晰,仅列出了执行语句。

50、出了执行语句。将2和3传递给a和bex1_02.exemain ()s = add(2,3);printf(“The sum is %d”, s);return 0;操作系统add(int a, int b)sum = a + b;return sum;编译系统提供库函数printf 进行计算并输出结果操作系统调用main()计算a+b返回sum的值到调用处返回操作系统图图1.9 程序程序ex1_02的执行过程的执行过程 经过编译、链接后的经过编译、链接后的C语言程序就成为一个可执行文语言程序就成为一个可执行文件。例如,程序的件。例如,程序的ex1_02的默认可执行文件名为的默认可执行文件名为

51、“ex1_02.exe”。若要执行这个程序,只要在操作系统的。若要执行这个程序,只要在操作系统的命令执行环境中打入这个文件名,系统就会开始执行这命令执行环境中打入这个文件名,系统就会开始执行这个程序。对于个程序。对于C语言程序而言,首先从调用主函数开始。语言程序而言,首先从调用主函数开始。 在主函数在主函数main中,第一个语句是中,第一个语句是 s = add(2,3);); 但是,这个语句的执行要分如下步骤才能完成。但是,这个语句的执行要分如下步骤才能完成。 调用函数调用函数add(),同时将数据(),同时将数据2和和3分别传送给函数分别传送给函数add()中的变量()中的变量a和和b;

52、使用表达式使用表达式a + b进行加法计算。进行加法计算。 将和用将和用“=”)送给函数)送给函数add()中的变量()中的变量sun中。注意中。注意“=”是赋值操作符,不是等号。是赋值操作符,不是等号。C语言中的等号是语言中的等号是“=”。 用用return语句将语句将sum的值返回的函数的值返回的函数add()的调用处。()的调用处。 将函数将函数add()的返回值送给主函数中的变量()的返回值送给主函数中的变量s。 执行函数执行函数printf(),输出下面的内容:(),输出下面的内容: The sun is 5这个语句的执行也需要如下多个步骤才能实现:这个语句的执行也需要如下多个步骤才

53、能实现: 圆括号中的引号中的圆括号中的引号中的“The sum is:”要求原样输出。要求原样输出。 圆括号中的引号中的圆括号中的引号中的“%”表示后面的字符表示后面的字符“d”是一个是一个格式字符,要求将双引号后面的表达式的值,按照整型格式字符,要求将双引号后面的表达式的值,按照整型数据输出。数据输出。 函数函数printf()将流程返回到调用处。()将流程返回到调用处。printf()也有返()也有返回值(成功返回输出的字符个数;失败时,返回一个负回值(成功返回输出的字符个数;失败时,返回一个负整数),但是一般不用。整数),但是一般不用。 执行执行main()中的返回语句()中的返回语句r

54、eturn,用,用“0”向操作系向操作系统送回统送回“平安平安”信号。信号。(2)变量及其类型)变量及其类型本例中的本例中的s和和sum都称为变量。变量是程序中被命名的数都称为变量。变量是程序中被命名的数据实体,并且它的值是可以改变的。同时,为了便于计据实体,并且它的值是可以改变的。同时,为了便于计算与存储,算与存储,C语言中程序中所使用的每个数据都被规范化语言中程序中所使用的每个数据都被规范化了。这种数据的规范称为数据类型。了。这种数据的规范称为数据类型。 本例中使用语句本例中使用语句 int s; 和和 int sum; 的作用就是声明了两个变量的作用就是声明了两个变量s和和sum名字和类

55、型(用名字和类型(用“int”表明它们是整型数据)。变量在使用之前都要先行声明。表明它们是整型数据)。变量在使用之前都要先行声明。(3)函数的声明)函数的声明 本例中的本例中的 int add(int,int ); 称为函数声明。函数声明的作用是让编译器知道该函数称为函数声明。函数声明的作用是让编译器知道该函数的原型(包括返回类型、参数个数和类型,以便对调用的原型(包括返回类型、参数个数和类型,以便对调用语句进行语法检查。如果定义在调用前,从定义可以直语句进行语法检查。如果定义在调用前,从定义可以直接获得这些信息,就可以不写声明;如果调用在定义之接获得这些信息,就可以不写声明;如果调用在定义之

56、前,则需要一个原型声明说明这些信息。前,则需要一个原型声明说明这些信息。对于编译系统提供的库函数,它们的定义不在程序中,对于编译系统提供的库函数,它们的定义不在程序中,因此需要给出相应的原型声明。为了方便使用,系统把因此需要给出相应的原型声明。为了方便使用,系统把某些类型的库函数的原型声明写在某个头文件中,程序某些类型的库函数的原型声明写在某个头文件中,程序员只要把要求的头文件用文件包含语句写在程序中函数员只要把要求的头文件用文件包含语句写在程序中函数调用之前,就等于把原型声明写在了函数调用之前。这调用之前,就等于把原型声明写在了函数调用之前。这就是使用函数就是使用函数printf(),必须在

57、其前写一条(),必须在其前写一条#include 的原因。的原因。(4)关于)关于printf()函数的参数函数的参数 printf()函数的参数有两部分:前面的用双引号引起函数的参数有两部分:前面的用双引号引起的部分称为的部分称为“控制串控制串”。控制串由一些字符组成,。控制串由一些字符组成,这些字符可以分成两类:第一类字符可以直接显示这些字符可以分成两类:第一类字符可以直接显示出来,第二类字符作为格式说明符使用。或者说,出来,第二类字符作为格式说明符使用。或者说,除了格式说明符之外的字符,都是可以直接显示的。除了格式说明符之外的字符,都是可以直接显示的。格式说明符是由格式说明符是由“%”开

58、头,后面跟着的是格式码。开头,后面跟着的是格式码。本例中的本例中的“d”就是格式码,它后面输出的数据按照就是格式码,它后面输出的数据按照带符号十进制输出。其他格式说明符将陆续介绍。带符号十进制输出。其他格式说明符将陆续介绍。(5)关于赋值运算)关于赋值运算 在在C语言中,符号语言中,符号“=”称为赋值运算符,它的作用是把后称为赋值运算符,它的作用是把后面(右面)的值,送到其前(左面)的变量(左值)中。面(右面)的值,送到其前(左面)的变量(左值)中。一定不要将其当作是等号。在一定不要将其当作是等号。在C语言中,等号是语言中,等号是“=”。例例1.3 计算一个数的正弦值的计算一个数的正弦值的C语

59、言程序。语言程序。/* 文件名:文件名:ex010301.c */# include include int main(void)float x;/*定义定义x为实型变量为实型变量*/x = sin(0.19199);/*调用调用sin函数函数*/printf(%fn,x);/*调用调用printf函数,输出函数,输出x的值的值*/程序的执行结果如下:程序的执行结果如下:0.190813 说明:说明:(1)“float x;”是声明:是声明:x是一个实型变量。是一个实型变量。(2)“x = sin(0.19199)”可执行一次函数调用,求出可执行一次函数调用,求出0.19199弧度的正弦值,并

60、赋给实型变量弧度的正弦值,并赋给实型变量x。sin()是一()是一个库函数,个库函数,math.h是其要求的头文件。是其要求的头文件。(3)printf()中的格式说明符()中的格式说明符“%f”,指定一个实型格,指定一个实型格式输出(前面介绍的式输出(前面介绍的%d是整型数据格式符)。通常输出是整型数据格式符)。通常输出的数据在小数后有的数据在小数后有6位数字;小数点前的数字位数不指定,位数字;小数点前的数字位数不指定,根据实际值的位数输出。格式说明符的类型要与后面要根据实际值的位数输出。格式说明符的类型要与后面要输出的数据类型相一致。输出的数据类型相一致。(4)printf()中的()中的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论