1.1 程序与程序设计语言
计算机程序(Program)是人们为解决某种问题用计算机可以识别的代码编排的一系列加工步骤。计算机能够严格按照这些步骤去执行,包括计算机对数据的处理。程序的执行过程实际上是对程序所表示的数据进行处理的过程。一方面,程序设计语言提供了一种表示数据与处理数据的功能;另一方面,编程人员必须按照语言所要求的规范(即语法规则)进行编程。
1.1.1 程序与指令
程序最根本的功能是对数据的处理,计算机最基本的处理数据的单元就是计算机指令。单独的一条指令本身只能完成计算机的一个最基本的功能,那么,计算机能实现的指令的集合则成为计算机的指令系统,而一系列计算机指令的有序组合就构成了程序。
程序在计算机中是以0、1组成的指令代码来表示的,即程序实际上是0、1的有序组合,这个序列能够被计算机直接识别。程序和数据一样,共同存放在存储器中。当程序要运行时,当前准备运行的指令从内存被调入CPU中,由CPU处理这条指令。
如果程序设计者直接用0、1的代码来编写计算机指令,那将无疑是一件非常令人难以忍受的事情,所以,程序设计语言就应时而生。用程序设计语言来描述程序,同时应用一种软件(如编译系统)将其描述的程序转换成计算机能够直接识别的指令序列。
总的来说,计算机程序是人们为了解决某种问题,用计算机可以识别的代码编排的一系列数据处理步骤,计算机将严格按照这些步骤去做。
1.1.2 程序设计语言的功能
程序设计语言,通常简称为编程语言,它是一种被标准化的交流技巧,是一组用来定义计算机程序的语法规则,用来向计算机发出指令,它可以让程序员准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。
程序设计语言必须具有数据表达和数据处理(也称为流程控制)的能力。
1.数据表达
数据种类多种多样,而语言本身的描述能力总是有限的。为了使程序设计语言能充分、有效地表达各种各样的数据,一般将数据抽象为若干种类型。数据类型(Data Type)就是对某些具有共同特点的数据集合的总称。比如大家常说的整数、实数等就是数据类型的例子。数据类型涉及两方面的内容:该数据类型代表的数据是什么(即数据类型的定义域)?能在这些数据上做什么(即操作,或称运算)?比如,整数类型所包含的数据有2,-2,0,100,…,而+,-,*,/等就是作用在整数上的运算。
在程序设计语言中,一般都需事先定义几种基本的数据类型,以供程序员直接使用,如整型、实型、字符型等。同时,为了使程序员能更充分地表达各种复杂的数据,程序设计语言还提供了构造新的数据类型的手段,如数组(Array)、结构(Structure)、指针(Pointer)等。
程序设计语言提供的基本数据类型以及构造复杂类型的手段,为有限能力的程序设计语言表达客观世界中的多种多样的数据提供了良好的基础。
2.流程控制
程序设计语言除了能表达各种各样的数据外,还必须提供一种手段来表达数据处理的过程,即程序的控制过程。程序的控制过程通过程序中的一系列语句来实现。
当要解决的问题比较复杂时,程序的控制过程同样会变得十分复杂。一种常用的程序设计方法是:将复杂程序划分成若干个相对独立的模块(Module),使完成每个模块的工作变得单纯而明确,在设计一个模块时不受其他模块的制约。同时,通过现有模块积木式的扩展就可以形成复杂的、更大的程序模块或程序。这种程序设计方法就是结构化的程序设计方法(Structured Programming)。C语言就是支持这种设计方法的典型语言。
在结构化程序设计方法中,一个模块可以是一条语句(Statement)、一段程序或一个函数等。一般来说,从程序流程的角度看,模块只有一个入口和一个出口。这种单入单出的结构为程序的调试(Debug,又称查错)提供了良好的条件。
按照结构化程序设计的特点,任何程序都可以将模块通过三种基本的控制结构进行组合来实现。这三种基本的控制结构分别是:顺序结构、分支结构和循环结构。
顺序结构(Sequential Structure):按照程序的书写先后顺序,执行完一个程序模块后,再顺序执行下一个模块。
分支结构(Branch Structure):又称选择结构。在程序执行过程中,根据不同的条件来选择所要执行的模块,即判断某种条件,若条件满足就执行某个模块,否则就执行另一个模块。
循环结构(Loop Structure):是指反复执行某个模块的过程。当然,重复执行这些模块通常是有条件的,只有条件满足时才会去重复执行相应的模块。
1.1.3 程序设计语言的语法
一般把用程序设计语言编写的未经编译的程序称为源程序(Source Code,又称源代码),而源程序的编写必须符合相应语言的语法(Grammar)。那么,从语法的角度来说,源程序实际上是一个字符序列。这些字符序列按顺序分别组成了一系列的“单词”。这些“单词”是为了按照一定的语法规则构成语言的各种成分而规定的。下面分别介绍C语言中的一些常用词汇和语法单位。
1.C语言的词汇
(1)C语言字符集。组成C语言源程序代码的基本字符称为C语言字符集,它是构成C语言的基本元素。C语言允许使用的基本字符有如下几种。
① 大小写英文字符:A~Z,a~z;
② 数字字符:0~9;
③ 特殊字符:+=_(下划线) ( ) *&^% # ! , .;: ?’”~\|/<>{} [ ];
④ 不可打印的字符:空格、换行符、制表符、响铃符。
一般的C语言源程序仅仅包含以上字符集中的字符,在具体的C语言编译系统中可对上述字符集加以扩充。
(2)关键字。关键字是具有特定含义的、专门用来说明C语言的特定成分的一类单词。例如,关键字int用来定义整型变量,而关键字float则用来定义浮点型变量。C语言的关键字都用小写字母书写,不能用大写字母书写。例如,关键字int不能写成Int。由于每个关键字都有特定的含义,所以不能作为用户程序中的变量名和函数名等,否则会产生编译错误。
在C89标准中共有32个关键字:
auto break case char const continue default
do double else enum extern float for
goto if int long register return short
signed sizeof static struct switch typedef union
unsigned void volatile while
在新的C99标准中,又增加了5个关键字:
_Bool _Complex _imaginary inline restrict
(3)标识符。计算机程序处理的对象是数据,程序用来描述数据处理的过程。在程序中,通过名字建立对象定义与使用的关系。为了满足这种需要,每种程序语言都规定了在程序中名字描述的规则。在C语言中用于标识名字的有效字符序列称为标识符,对标识符做了如下规定。
① 标识符的第一个字符必须是英文字母或下划线( _ )。
②如果第一个字符后面还有字符序列,则它应是英文字母、下划线或数字组成的序列。标识符中的英文字母大小写是有区别的,如标识符abc与标识符ABC不相同。为了便于读者对标识符有进一步的认识,下面列举若干正确的标识符和不正确的标识符。
正确的标识符:
Abc abc _Abc _4a5
不正确的标识符:
A? (含有不合法字符“?”)
2abc (第一个字符不允许为数字)
a b (标识符中不允许有空格)
yes/no (含有不合法字符“/”)
πr (“π”为不合法字符)
标识符中有效字符个数(也称长度)视系统不同而不同。例如,Turbo C规定前32个字符有效,超过的部分忽略。比如,对于8个字符有效的标识符而言,identifi与identifier被视为同一标识符,因后者中的er已被忽略。
以后将会看到,标识符用来为变量、符号常量、数组、函数等取名。使用时,标识符的选择由程序员自定,但是不能与关键字相同。另外,为了增加程序的可读性,选择标识符时应遵循“见名知义”的原则,即选择描述性的标识符,标识符应尽量与所要命名的对象间有一定的联系,以助于识别和记忆。例如:
longth (表示长度)
time (表示时间)
pi (表示圆周率π)
(4)保留标识符。保留标识符是系统保留的一部分标识符,通常用于系统定义和标准库函数的名字。例如,以下划线开始的标识符通常用于定义系统变量。虽然它们也是合法的标识符,但用作一般标识符时可能会出现运行错误,因此不能使用这些标识符来定义自己的变量。
(5)注释。在C语言程序中,注释部分的格式是:
/*注释内容*/ 或 //注释内容
注释不是程序代码,是对程序解释说明的标注,它可以是任何可显示的字符,不影响程序的编译和运行,程序编译时编译程序把注释作为空白符跳过而不予处理。另外,注释不允许嵌套。
例如:/*学生成绩管理程序*/、//My c program
在程序中插入适当的注释,可以使程序容易被人理解。
2.C语言的主要语法单位
(1)变量定义。不同的变量有数据类型之分,在声明变量的时候一定要对其类型加以说明。变量类型的不同,说明其在计算机内存中所占的存储空间大小也不同。声明变量的一般格式为:
类型说明符 变量名;
例如:int i; /*声明了一个整型变量i*/
(2)表达式。由运算符及其运算对象可以组成形形色色的表达式。如:3.14*3*sin(x)。表达式中的运算符有运算优先级,如:表达式2+3*4-4/4中,应先执行运算符*和/,再执行运算符+和-。
(3)语句。语句是程序最基本的执行单位,程序的功能就是通过执行一系列的语句来实现的。C语言提供了多种语句,大致可分为五类:表达式语句、函数调用语句、控制语句、复合语句、空语句。
① 表达式语句。表达式语句由表达式末尾加上分号“;”组成。其一般形式为:表达式;
执行表达式语句就是计算表达式的值。例如:
m=2; 赋值语句
m+n; 算术表达式语句
m>n; 关系表达式
i++; 增量表达式
②函数调用语句。由函数名、实际参数加上分号“;”组成。其一般形式为:函数名(实际参数表);
执行函数调用语句就是调用函数并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。
调用库函数,输出字符串。
例如:
printf("%d",m); /*调用名为printf的标准库函数*/
③控制语句。控制语句用于控制程序的流程,以实现程序的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句,分成以下三类。
条件判断语句
条件判断语句包括:if语句、switch语句。
循环执行语句
循环语句包括:for语句、while语句、do while语句。
跳转语句
跳转语句包括:break语句、continue语句、return语句和goto语句。(其中,goto语句应尽量少用,因为这不利于结构化程序设计,滥用它会使程序流程无规律、可读性差)。
④复合语句。把多个相关语句用一对花括号"{}"括起来,组成的一个语句就称为复合语句。在程序中,应把复合语句当作是单条语句,而不是多条语句。例如:
{
temp=x; /*将x的值赋予temp*/
x=y; /*将y的值赋予x*/
y=temp; /*将temp的值赋予y*/
}
这就是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,但是在花括号“}”外却不能加分号。
⑤ 空语句。只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句,在程序中空语句可用来作空循环体。
例如:while(getchar()!='\n');本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。
(4)函数定义。函数是完成特定任务的独立模块,是C语言唯一的一种子程序形式。函数的目的通常是接收0个或多个数据(称为函数的参数),并返回0个或1个结果(称为函数的返回值)。函数的使用主要涉及函数的定义与调用。
函数定义的主要内容是通过编写一系列语句来规定其所完成的功能。完整的函数定义涉及函数头和函数体。其中,函数头包括函数的返回值类型、函数名、参数类型;而函数体是一个程序模块,规定了该函数所具有的功能。函数调用则通过传递函数的参数并执行函数定义所规定的程序过程,以实现相应的功能。以下是函数定义的一个简单例子。
(5)输入与输出。C语言没有输入输出语句,它通过调用系统库函数中的有关函数[如:printf()、scanf()函数等]实现数据的输入和输出,这种处理方式为C语言在不同硬件平台上的可移植性提供了良好的基础。相关的输入、输出函数的使用及其功能将会在后面陆续做讲解。