1.5 C语言简介
1.5.1 C语言的功能
程序设计语言是人们用来编写程序的手段,在程序设计中,必须用程序设计语言表达所要处理的数据和数据处理的流程控制。因此,程序设计语言必须具有数据表达和流程控制的能力。C语言也是如此。
1.数据表达
世界上的数据多种多样,而C语言描述数据的能力总是有限的。为了使C语言能充分有效地表达各种各样的数据,一般将数据抽象为若干个数据类型。数据类型就是对某种具有共同特点的数据集合的总称。数据类型涉及两方面的内容:数据类型的定义域和数据操作。数据类型的定义域规定该类型代表什么数据,数据操作规定该类型能做什么运算。例如,整数就是一种数据类型,它的定义域是{…,-1,0,1,2,…},它的数据操作包括+、-、*、/等运算。C语言提供了基本数据类型和构造数据类型。
基本数据类型:就是C语言预先定义好的数据类型,程序员可以直接使用,如整数、实型、字符型等。这些基本数据类型在程序中的具体对象主要有两种形式:常量和变量。常量值在程序中是不变的,例如123就是一个整型常量。变量在程序中可以改变它的值。例1-2中的语句int i;就定义了一个整型变量i,程序中就可以对变量i进行相应的操作。
构造数据类型:在基本数据类型基础上,C语言还提供了构建新的数据类型的手段,使程序员能更充分地表达各种复杂的数据。包括数组、指针、结构、联合、文件等构造数据类型。例如语句int a[10];就定义了一个由10个整数组成的数组变量a,其中a[0]、a[1]、…、a[9]称为数组元素,每个数组元素就相当于一个简单的整型变量。
2.流程控制
C程序设计语言除了能表达各种类型的数据外,还必须提供表达数据处理过程的方法和手段,即数据处理的流程控制。流程控制一般通过一系列的语句来实现。
C语言是一种典型的结构化程序设计语言,支持结构化的程序设计方法,在解决比较复杂的问题时,其处理方法是:将复杂程序划分为若干个相互独立的模块(Module),使完成每个模块的工作变得简单明确,再通过积木式的扩展方法将各种模块搭建起来,构建复杂的、规模更大的程序。每个模块可以是一条语句、一段程序或者一个函数。
按照结构化程序设计方法的观点,C语言提供了语句级控制和单位级控制两种方式。语句级控制就是通常所说的3种基本控制结构(顺序结构、分支结构和循环结构),如图1-3所示。单位级控制就是函数结构。

图1-3 3种基本控制结构
(1)顺序结构
按照自然顺序,依次执行第一个模块A、第二个模块B、……。它是最简单的一种基本控制结构,如图1-3(a)所示。
(2)分支结构
分支结构又称选择结构,需要根据不同的条件来选择执行不同的模块,如图1-3(b)所示。即需要判断某种条件,如果条件满足就执行模块A,否则就执行模块B。
(3)循环结构
循环结构又称重复结构,即重复执行某个模块,如图1-3(c)所示。重复执行某个模块一般需要满足一定的条件,即检测某些条件,当条件满足时就重复执行相应的模块。
(4)函数结构
C程序由函数组成,通常由一个main()函数带若干个用户自定义函数构成。函数通过一系列语句的组合来完成某种特定的功能(如例1-2中的fact()函数实现求n!),函数间可以相互调用,函数调用时可以传递参数,函数调用的结果可以返回给调用函数。这种涉及函数声明、函数定义和函数调用的控制称为单位级控制。函数结构为构建复杂应用程序提供了一种好的解决方案。
1.5.2 C语言字符集、标识符与关键字
1.字符集
任何一个计算机系统所能使用的字符都是固定的、有限的。要使用某种计算机语言来编程,就必须符合该语言规定的,并且计算机系统能够使用的字符。C语言的基本字符集包括英文字母、阿拉伯数字以及其他一些符号,具体归纳如下:
①英文字母:包括大小写各26个,共计52个。
②阿拉伯数字:0~9,共计10个。
③下画线:_。
④其他特殊符号:主要是运算符,这些特殊符号集如下。
+ - * / % ++ -- < >= >= <= == != !
|| && ^ ~ | & << >>() [ ] \ " " ? : , ; '
2.标识符
在C语言中,标识符用来表示函数名、类型名、变量名和常量名,由字母、数字和下画线组合而成,但首字符必须是字母或下画线。下面给出一些合法与非法标识符,请读者仔细识别。
合法标识符:ab、_a12、sum、avg、day。
非法标识符:12a、#abc、Ms.r、a*b、a-b。
说明:关于C语言的标识符使用,有以下几点特别说明。
①区分大小写字母。例如,A1与a1是不同的标识符。
②不同编译系统对标识符长度都有自己的规定,读者应特别注意。
● MS C规定:标识符中只有前8个字符的长度有效,8个字符以后的字符不作识别。如teacher_1和teacher_2是同一个标识符。
● Turbo C规定:标识符最长可允许32个字符。建议初学者不要取名太长。
3.关键字
关键字就是指C语言系统中规定的具有特定含义的标识符。关键字不能用作变量名、常量名或函数名来使用,用户只能根据系统的规定使用它们。根据ANSI标准,C语言可以使用以下32个关键字:

1.5.3 C语言的主要语法单位
编程序就是将问题求解的算法用程序设计语言正确无误地翻译出来。这里所说的正确性包括两个方面,首先语法要正确,即必须符合语言所规定的语法规则。其次运行结果必须正确,保证程序运行的结果与实际情况相符。下面简单介绍C语言的语法。
1.常量
常量是指在程序运行过程中,其值不能被改变的量。常量有类型之分,包括整型常量、实型常量、字符常量、字符串常量和符号常量。例如,123是整型常量、3.14是实型常量、'a'是字符常量、"World"是字符串常量等。
2.变量
变量是指在程序运行过程中,其值是可以被改变的量。变量通常具有名字,称为变量名,变量名必须是合法的标识符。变量有数据类型,定义时必须指明变量的数据类型,以便系统为其分配内存空间。
说明:关于变量的使用,有以下几点特别说明。
①变量代表内存空间,不同类型的变量占用的内存单元大小也不同,而且与编译系统有关。
②变量必须先定义再使用。
● 变量定义的一般形式为:数据类型名变量名表;。
● 作用:声明变量的名称和类型,分配相应的内存单元。
例如,int a,b;即定义了两个整型变量a和b。
3.运算符
运算符表示对各种类型数据对象的运算操作。C语言的运算符非常丰富,主要有三大类:算术运算符、关系运算符和逻辑运算符。除此之外,还有一些特殊的运算符,如赋值运算符、条件运算符、逗号运算符等。这里主要列出算术运算符、关系运算符和逻辑运算符。
①算术运算符:+(加)、-(减)、*(乘)、/(除)、%(求余)。
②关系运算符:>(大于)、<(小于)、>=(大于或等于)、<=(小于或等于)、==(等于)、!=(不等于)。
③逻辑运算符:&&(逻辑与)、||(逻辑或)、!(逻辑非)。
说明:C语言的运算符也可按运算对象的个数分为一目运算符、二目运算符和三目运算符。
● 一目运算符:只有一个操作数的运算符,如a++,只有a这个操作数。
● 二目运算符:有两个操作数的运算符,如a+b,有a和b两个操作数。
● 三目运算符:有3个操作数的运算符,C语言只有条件运算符是三目运算符。
4.表达式
用运算符将运算对象(可以是常量、变量和函数)连接起来的符合C语言规则的式子,称为表达式。表达式具有计算功能,计算结果称为表达式的值。在C语言中,主要有算术表达式、关系表达式和逻辑表达式3种。当然还有其他特殊表达式,这里主要介绍上述3种表达式。
(1)算术表达式
用算术运算符和括号将运算对象连接起来的符合C语言规则的式子,称为算术表达式。例如,b*b-4*a*c就是b2-4ac的算术表达式。其值是一个算术值。
(2)关系表达式
用关系运算符和括号将运算对象连接起来的符合C语言规则的式子,称为关系表达式,也称比较表达式。例如,a>b就是比较a和b大小的一个关系表达式。其值是一个逻辑值“真”或“假”。
(3)逻辑表达式
用逻辑运算符和括号将运算对象连接起来的符合C语言规则的式子,称为逻辑表达式。例如,a>0&&b>0就是表示a和b都是正数的逻辑表达式。其值是一个逻辑值“真”或“假”。
说明:C语言没有逻辑量,用非0代表“真”,用0代表“假”。
5.语句
语句是程序最基本的执行单位,程序的功能就是通过一系列的语句组合起来实现的。C语言中的语句有多种,这里主要介绍几种常用的语句。
(1)赋值语句
用赋值运算符“=”将一个变量和一个表达式连接起来,然后在末尾加上英文分号“;”就构成赋值语句。它的一般形式为:

作用:先求解赋值运算符右侧<表达式>的值,然后赋给赋值运算符左侧的变量。
举例:d=b*b-4*b*C;。
说明:“=”是赋值号,不是比较运算符,“=”左侧只能是变量,右侧可以是常量、变量、函数等组成的表达式。
(2)分支语句
分支语句实现分支结构,根据不同的条件执行不同的语句(或语句模块)。在C语言中有if-else语句、else-if语句和switch语句3种。其中:if-else语句实现两分支结构;else-if语句和switch语句实现多分支结构。
举例:if(a>b)max=a;else max=b;。
作用:求a和b的最大值并赋值给max。
执行流程:若a>b,则执行语句max=a;,将a赋给max;否则执行语句max=b;,将b赋给max。
(3)循环语句
循环语句实现重复结构(也称循环结构),根据循环条件重复执行某条语句(或语句模块)。在C语言中有for语句、while语句和do-while语句3种。其中:for语句一般用于循环次数已知的循环结构;while语句和do-while语句一般用于循环次数未知的循环结构。
举例:求表达式s=1+2+…+100的值。
累加和程序段:使用for循环语句实现。

执行流程:设置sum初值为0,循环变量i的初值为1,反复执行sum=sum+i和i++操作,直到i超出100为止。循环结束后,变量sum的值就是累加和。
(4)复合语句
用一对花括号将若干语句顺序组合在一起就组成一条复合语句。例如,下面两条语句组合在一起就是一条复合语句:

说明:当多条语句当作一个整体被执行时,必须变成复合语句。
6.函数
C程序由函数组成,通常由一个main()函数带若干个用户自定义函数构成。函数通过一系列语句的组合来完成某种特定的功能(如例1-2中的fact()函数实现求n!),函数间可以相互调用,函数调用时可以传递参数,函数调用的结果可以返回给调用函数。函数的使用涉及函数声明、函数定义和函数调用。函数为构建复杂应用程序提供了一种好的解决方案。
7.输入与输出
在C语言中,没有专门的输入/输出语句,它通过调用系统库函数中的相关函数(如scanf()和printf()函数)来实现数据的输入和输出。这也为C语言程序的可移植性提供了良好的基础。例如,下面两条语句就是输入和输出函数:

说明:%d为格式说明,表示十进制整数,在scanf()函数中表示按十进制整数输入,在printf()函数中表示按十进制整数输出。
1.5.4 C语言程序的上机步骤
编写一个程序需要做许多工作,包括编辑、编译、连接和运行调试等过程。因此,不管是哪种编程环境,Microsoft C、Turbo C还是Visual C++,都集成了相应的功能,使用非常方便,要求程序员能够熟练掌握。C语言程序的上机步骤如图1-4所示。

图1-4 C语言程序的上机步骤
在图1-4中,虚线表示当某一步骤出现错误时的修改路线。运行时,无论是出现编译错误、连接错误,还是运行错误,都需要修改源程序,并对它重新编译、连接和运行,直至将程序调试正确为止。
说明:关于C语言程序的上机步骤,有以下几点说明。
①源程序:按照C语言语法规则而编写的C程序称为源程序。源程序由字母、数字及其他符号等构成,源程序文件的扩展名为.c。源程序不能被机器执行。
②目标程序:对源程序进行编译处理,即把每一条语句用若干条机器指令来实现以生成由机器指令组成的程序称为目标程序。目标程序文件的扩展名为.obj。
③可执行程序:将“库函数”的处理过程连接到经编译生成的目标程序中生成的程序文件。可执行程序的扩展名为.exe。
④编译错误:程序编译时检查出来的语法错误。通常是编程者违反了C语言的语法规则,如保留字输入错误、花括号不匹配、语句少分号等。
⑤连接错误:程序连接时检查出来的错误。通常由未定义或未指明要连接的函数,或者函数调用不匹配等因素引起,特别是对系统函数的调用必须通过include说明。
⑥运行错误:程序通过了编译连接,并能够在计算机上运行,但得到的结果不正确,这类在程序执行过程中的错误称为运行错误,也称逻辑错误或语义错误。这种错误最难修改,往往需要系统提供的调试工具找出真正的错误。
⑦程序调试:对于程序的运行错误,往往需要进行程序调试。根据出错现象找出错误并改正错误的过程称为程序调试。一般程序的编程环境都提供相应的调试手段。调试最主要的方法包括单步调试、断点调试、观察变量等。