
出版社: 科学
原售价: 49.80
折扣价: 39.34
折扣购买: C语言程序设计(科学出版社十三五普通高等教育本科规划教材)
ISBN: 9787030695666
第1章 绪论
本章主要内容:
计算机程序设计语言发展过程
简单C语言程序的基本结构
构成C程序的基本组件——函数及其组成结构
函数的声明,函数原型
形式参数、实际参数
函数的调用和执行过程
C程序的开发运行环境和步骤
本章重点:
简单C语言程序的基本结构:注释、预处理指令和函数
构成C程序的基本组件:函数及其组成结构
形式参数、实际参数
函数的调用和执行过程
1.1 计算机程序设计语言发展过程
计算机能有条不紊地完成工作是通过执行事先设计好的程序来进行控制的。程序是为实现特定目标或解决特定问题而用计算机语言编写的命令系列集合。不同的程序完成不同的功能。生活中也有很多类似“程序”的概念,如做一套健美操的步骤,烘焙一种蛋糕的方法和过程。
语言是交流的工具,自然语言是人与人之间交流的工具,计算机语言就是人和计算机之间交流信息的工具。在这一点上它和英语、法语和中文等其他语言本质上是一样的。程序必须使用计算机语言来描述。按照计算机语言对硬件的依赖程度,计算机语言可以分为低级语言和高级语言。低级语言有机器语言和汇编语言,低级语言执行速度快,运算效率高,但使用复杂、烦琐、费时、易出差错。高级语言接近自然语言,移植性好,易学、易掌握。下面按计算机语言的发展过程依次对这些语言给予介绍。
1.机器语言
计算机能直接识别的语言是二进制语言,即只有“0”和“1”两个符号,称为机器语言。因为计算机是由电驱动的,通常高电平表示1,低电平表示0。可以用它们的不同组合代表不同的含义,例如,规定用0011110001010000代表做乘法指令,其他不同的二进制串代表减法、加法等不同的操作。所有的这些规定就构成了一类机器指令集合,称为指令系统。低级语言指令系统与不同的计算机系统相关联,此处主要是指与计算机CPU的不同类型相关,这是因为不同的CPU型号系列(现在比较流行的CPU系列有Intel酷睿、AMD Ryzen和ARM等),其指令系统是不同的,所以在一种系列的计算机上可以执行的程序,在另一种系列上则不能正确执行,必须要重新编写,可移植性差。但由于它是针对特定CPU型号的计算机,故其运算效率是最高的。另外,机器语言难懂、易错、难检查、难修改,不好使用,于是人们研发出了汇编语言。
2.汇编语言
汇编语言又称为符号语言,它用一些英文字符和数字等助记符表示机器指令,如用ADD代表“加法”,MOV代表“数据传递”等,这样程序就易读易记了,一般一条汇编语言指令对应一条机器指令。由于不同型号系列CPU的计算机的机器语言指令系统集合是不一样的,所以汇编语言程序和机器语言程序一样移植性不好,比如在Intel系列机器上可以运行的程序,在AMD系列机器上就不能正常运行,所以称它们都是面向机器的低级语言。
3.高级语言
由于汇编语言依赖于硬件系统,并且助记符多,仍然不够方便,而且对硬件过度依赖,要求使用者对硬件结构及其工作原理都十分熟悉,由此促进人们研发出与人类自然语言相近、易学易用、移植性好的计算机语言。在20世纪50年代出现了计算机高级语言,它的语法接近英文,又不依赖于计算机硬件,在一定程度上与机器无关,只要在计算机上有相应的编译系统,就可以把它翻译成二进制机器码进行运行。先后出现了非结构化语言FORTRAN、Basic,结构化语言C、Pascal、FORTRAN77等。高级语言是面向用户的语言。
C语言从严格意义上来说,既有高级语言的特点,也有低级语言的特点。允许直接对硬件进行操作,能进行位(bit)操作,能实现汇编语言的大部分功能。所以C语言也常用于底层软件开发,如操作系统、编译器、各类插件、嵌入式系统软件、单片机程序、物联网应用等。这也是C语言区别于其他高级语言的独特之处,以致它能在过去的40多年里经久不衰。
4.面向对象语言
尽管高级语言已经比较方便了,但随着信息技术的发展,需要处理的问题越来越复杂,其功能有些不能满足需要了。高级语言是面向过程的,程序的执行像流水线似的,无法动态地改变程序的执行方向。这同人类日常处理事务的方式是不一样的,人们希望发生一件事就处理一件事,不能面向过程,而是面向具体的应用功能,即对象。所以在20世纪80年代出现了软件设计思想上的一次革命,其结果就是产生了面向对象的程序设计。
面向对象程序设计思想同以往根本不同的是其思维方法,它更直接地描述客观世界的事物(即对象)及事物之间的相互联系,并进行抽象,将人类的思维和表达方式直接应用于软件开发,从而可以更好、更有效地处理大型的、复杂的问题。先后出现了C++、C#、VB、Java、Python等有影响力的面向对象语言。
计算机语言的发展过程及其特点如图1-1所示。
图1-1 计算机语言的发展过程
1.2 C语言的发展及应用领域
C语言是贝尔实验室的 D.M.Ritchie(丹尼斯 里奇)和Ken Thompson(肯 汤普森)在 BCPL(BasicCombined Programming Language)语言的基础上发展而来的,最初用于开发多用户、多任务的UNIX操作系统上,后来丹尼斯 里奇用C语言改写了UNIX的编译程序,肯 汤普森又用C语言成功地改写了UNIX,从此开创了编程史上的新篇章,UNIX成为**个不是用汇编语言编写的主流操作系统。1978年后,C语言很快风靡全世界,成为最广泛使用的高级语言,并且流行至今。
C语言相当灵活,用于计算机程序能完成的几乎所有任务,包括应用程序、物联网应用、游戏、操作系统等。常用的C#、Java、MySQL、PHP等语言也主要是用C语言开发的。美国“阿波罗-11”航天飞船登月的软件系统、波音飞机的飞行系统、**个3DPS游戏雷神之锤(Quake)等主要也是用C语言实现的。其他语言的许多编译器和解释器也是用C语言编写的。而C语言的最强大之处是它的底层编程功能,它同时具有高级语言和汇编语言的优点,能直接访问内存的物理地址,对硬件进行操作,用来编写系统软件,例如编译器、驱动程序、操作系统内核、各种嵌入式软件、各类插件等。
随着C语言的不断发展,C社区意识到需要有一个更全面、新颖、严格的标准,于是在1983年,美国国家标准协会(American National Standard Institute,ANSI)成立了一个委员会,根据C语言问世以来各种版本对C语言的发展和扩充,制定了**个C语言标准草案。1989年,ANSI公布了一个完整的C语言标准—ANSI X3.159-1989(常称 ANSIC,或C89),定义了C语言和C标准库。1990年,国际标准化组织(International Standard Organization,ISO)接受C89作为国际标准ISO/IEC 9899:1990。1995年和1999年,ISO又对C语言标准进行修订,在基本保留原来的C语言特征的基础上,针对应用的需要,增加了一些功能,尤其是C++中的一些功能,并将其命名为C99。最新版本是C11(ISO/IEC 9899:2011)。本书的叙述遵循C11标准,目前不同软件公司提供的各种C语言编译系统多数并未完全实现C11建议的功能,因为对一些应用而言,并不需要使用到它的所有特性。
1.3 剖析一个简单的C程序
要使用好一门语言,必须要熟悉它的基本语法。C语言语法简洁,易学易记。下面通过一个简单的程序示例,来详细解释一些C程序语句的功能及最基本的语法,同时介绍一个简单C语言程序的基本组成部分。
【例1.1】在屏幕上输出一行文字“I begin to studyC program.”。
程序如下:
由上面程序图示可看到,一个C程序包含程序注释、预处理指令和定义主函数三大部分,以下逐个详细介绍。
1.3.1 程序注释
程序最前面的第1行到第5行包含在“/*”“*/”符号对以内的语句是程序的注释。注释不是程序代码,是不执行操作的,只是告知阅读程序的人一些信息,通常包括这个程序的名称及它的功能。C语言的注释有块注释和单行注释两种。块注释用“/*”“*/”符号对包含在内,单行注释用符号“//”后面的文字说明本行的作用,如第7行尾部。
注释的原则是有助于对程序的阅读理解,只有在必要的地方才加注释。
1.3.2 预处理指令
以符号“#”开头的指令表示这是预处理指令,一般放在程序源文件的开头。它的作用是告诉编译器在编译源代码之前的预处理阶段要做的一些工作,它并不是执行语句。
第6行的语句#include <stdio.h>告知编译器把文件 stdio.h中的内容包含在当前程序中,实际上就是把文件stdio.h复制到此位置。stdio.h是头文件(header file),通常放在文件的开头处,它是属于C语言的标准库函数,stdio是标准输入输出(standard input/output)的缩写,因为要用到此头文件中的 printf函数,所以必须把它包含进来。标准库函数是其他人已经写好的程序的集合,可以直接程序员调用来完成相应的功能。有关标准库函数的详细内容,将在第4章中介绍,现在只需要知道程序中要用到的库函数必须把它所在的头文件包含进来即可。
1.3.3 定义主函数
例1.1 程序中第7行到第11行指令的作用是定义主函数,即 main函数。可先通过下面的单行注释掌握每个语句的基本功能。
第7行int main(void)的作用是标志 main函数定义的开始,关键字int表示main函数的返回值是整型(integer),即整数。函数返回值是函数执行完成后返回的结果。有关关键字的详细内容在3.1节介绍。小括号表示main是一个函数,括号内的 void表示参数为空,没有数据传递给 main函数,参数为空也可以什么都不写。
第8行和第11行的花括号把函数的函数体括起来,同时表示其开始和结束。
第9行语句调用printf库函数完成在屏幕上显示信息的功能,此函数的作用是把双引号内的内容输出到屏幕上显示,最后的“\\n”是转义字符,表示把光标移到下一行,有关转义字符的内容在3.4.3节中介绍。printf函数是库函数,库函数是已经编制好的程序,一般都集中放在函数库中,提供给需要的程序员调用。
第10行return 0语句结束函数的执行,把0返回给操作系统,它与第7行要求的函数的返回值类型是一致的,都是整型。
注意:
C语言的每一个执行语句都用分号结束。
函数是C程序的基本单元,每个C程序都由一个或多个函数组成,并且必须有且只能有一个main函数,即主函数。main函数是程序执行的入口,所以读一个程序时要先读它的main函数。
1.4 C语言函数的定义及其组成部分
1.3节已讲述了C语言由函数组成,因此掌握函数的有关内容是非常重要的。函数(function)是完成特定任务的独立程序代码单元。C语言中的函数和其他程序设计语言中的函数、子程序、过程和方法等的作用相同,只是细节上有一些差别。
使用函数有很多好处。首先,可以省去重复编写代码的苦差。如果某个任务需要经常反复使用,那么只要把它写成一个函数,需要的时候调用此函数即可,不需要一次又一次地写程序代码。例如,前面程序中输出信息的 printf函数,几乎在所有的程序中都要用到,把它写成函数,就实现了一次编写代码、多次使用的目的。其次,使用函数可以让程序变得模块化。通常将复杂的问题分为更小的模块解决,一个函数一般对应一个功能模块。
函数是构成C程序的细胞,因此首先必须把它的基本组成结构搞清楚