1.2 认识C语言程序
1.2.1 简单的C语言程序
为了说明C语言程序结构的特点,先看以下几个程序。这几个程序由简到难,表现了C语言源程序在组成结构上的特点。虽然有关内容还未介绍,但可从这些例子中了解到组成一个C语言程序的基本部分和书写格式。
【例1.1】 在屏幕上输出“Hello world!”。
程序实现:
#include <stdio.h> //头文件包含命令
void main( ) //main是主函数的函数名
{ //用{表示函数体的开始
printf("Hello world!\n"); //输出“Hello world!”到屏幕
} //用}表示函数体的结束
程序分析:
本例的第 1 行#include <stdio.h>称为预处理命令。预处理命令是以#开头的代码行。#必须是该行除了任何空白字符外的第一个字符。#后是命令关键字,在关键字和#之间允许存在任意个数的空白字符。整行语句构成了一条预处理命令,该命令将在编译器进行编译之前对源代码做某些转换。常见的预处理命令有两种:#include文件包含命令和#define宏定义命令。#include文件包含命令,其意义是把尖括号< >或双引号" "内指定的文件包含到本程序中,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h,也称为头文件或首部文件。C语言的头文件中包括了各个标准库函数的函数原型。凡是在程序中调用一个库函数时,都必须包含该函数原型所在的头文件。在本例中,stdio.h是标准的输入输出头文件,输出函数 printf 是该文件中的标准输入输出函数,表示输出双引号里的内容,其中“\n”表示换行。
运行结果最下方的“Press any key to continue”是由操作系统自动添加的,意思是“按任意键继续”,不是程序运行结果的组成部分。此时按下键盘上的任意一个键后,将返回到 C语言编辑开发环境。
【例1.2】 计算两数a、b之和,并输出结果c。
程序实现:
#include <stdio.h>
void main( )
{
int a,b,c; //定义三个整型变量a,b,c
a=1; b=2; //对变量a、b赋值
c=a+b; //求a、b的和,并赋值给c
printf("c=%d\n",c); //按照整型值输出c的值
}
程序分析:
本例的主函数体分为两部分,前半部分为定义部分,后半部分为执行部分。定义是对变量的定义。C语言规定,程序中所有用到的变量都必须先定义,然后才能使用,否则将会出错。程序第4行是定义语句,定义了整型变量a、b、c。
定义部分后为执行部分或称为执行语句部分,用以完成程序的功能。第5行是赋值语句,使a和b的值分别为1和2。第6行计算a+b,并将结果赋值给c。第7行是输出语句,以%d的格式输出c的值,其中%d表示“十进制整数类型”。在执行输出时,“c=”按原样输出,在%d的位置上代以一个十进制整数值,printf函数中括号内逗号右端的c是要输出的变量。运行时将会把c的值以十进制整数的格式输出在%d的位置上。
【例1.3】 从键盘输入一个实数,求它的正弦值,然后输出结果。
程序实现:
#include <stdio.h>
#include <math.h> //包含头文件math.h
void main( )
{
double x,s; //定义两个双精度浮点型变量x,s
printf("input number x:\n");
scanf("%lf",&x); //调用scanf函数从键盘输入一个双精度浮点型值到变量x
s=sin(x); //调用sin函数计算变量x的正弦值,并把结果赋给变量s
printf("sin(%lf)= %lf\n",x,s); //按照双精度浮点型输出x对应的正弦值s
}
程序分析:
本例的前两行是预处理命令,预处理命令根据需要可以有多行。在本例中,使用了三个C语言提供的库函数:正弦函数sin、输入函数scanf和输出函数printf。正弦函数sin是数学函数,其所在的头文件为math.h文件,因此在程序的预处理部分用include命令包含了math.h。另两个函数scanf和printf是标准输入/输出函数,其所在的头文件为stdio.h,所以在主函数前也用include命令包含了stdio.h文件。
本例中使用了两个变量x和s,分别用来表示输入的自变量和正弦函数值。由于sin函数要求这两个量必须是双精度浮点型,故第5行定义部分用类型标识符double来定义这两个变量。第6行是执行部分的输出语句,调用printf函数在屏幕上输出提示信息“input number:”,通知用户输入自变量x的值。第7行为输入语句,调用scanf函数,接收用户从键盘上输入的数并存入变量x中。另外,要注意sin函数要求输入的参数x为弧度值。第8行是调用sin函数并把结果函数值送到变量s中。第9行是用printf 函数输出变量s的值(即x的正弦值)给用户。
本例程序执行步骤如下。
(1)定义变量x、s。
(2)printf函数在屏幕上显示提示信息,通知用户输入一个数x。
(3)用户输入一个数(如3.14),然后按下【Enter】键,输入结束。
(4)scanf函数接收到这个数,并送入变量x中。
(5)调用sin函数,把x的值作为实际参数传送给sin函数。
(6)在sin函数中计算x的正弦值,计算完将结果值返回给主函数。
(7)主函数收到返回值后赋给变量s。
(8)在屏幕上输出sin(x)= s的值。
【例1.4】 输入两个整数,比较后输出其中较大的数。
程序实现:
#include <stdio.h>
int max(int a, int b); //声明一个整型函数max,有两个整型参数a,b
void main( )
{
int x,y,z;
printf("input two numbers:\n");
scanf("%d%d",&x,&y); //调用scanf函数从键盘输入两个整型值到变量x,y
z=max(x,y); //调用max函数,并传递参数x,y。然后将返回值赋给z
printf("max=%d\n",z);
}
int max(int a, int b) //定义max函数,有两个整型参数a、b
{
if(a>b)
return a;
else
return b;
}
程序分析:
本例的程序由主函数和max函数两个函数组成。C语言规定,程序中所有用到的自定义函数都必须先声明或定义,然后才能使用,否则将会出错。本例中主函数调用了max函数,而max 函数是一个用户自定义函数,因此应在主函数调用max函数前进行声明或定义,本例中在程序的第2行进行了声明。max函数的功能是:如果传入的参数a的值大于b的值,则返回a的值;否则返回b的值。
本例程序执行步骤如下。
(1)定义变量x、y、z。
(2)printf函数在屏幕上显示提示信息,通知用户输入两个数。
(3)用户输入两个数(如3和5),然后按下【Enter】键,输入结束。
(4)scanf函数接收这两个数,并送入变量x、y中。
(5)调用max函数,把x、y的值作为实际参数传送给max函数的形式参数a、b。
(6)在max函数中比较a、b的大小,将大者的值返回给主函数。
(7)主函数收到返回值后赋给变量z。
(8)在屏幕上输出max=z的值。
1.2.2 C语言源程序的结构特点
●一个 C 语言源程序可以由一个或多个源文件组成。每个源文件可由一个或多个函数组成。
●C 语言源程序的基本组成单位是函数;一个 C 程序可由若干个函数组成,其中必须有且仅有一个以main命名的主函数,其余的函数名称可由编程者自行设定。
●C程序的执行总是由main( )函数的第一个可执行语句开始,到main( )函数的最后一个可执行的语句结束;而其他函数都是在main( )函数开始执行以后,通过函数的调用才得以运行。
●C 语言系统提供了丰富的库函数,用户在程序中需要调用某个库函数时,必须用预处理命令#include将描述该库函数的头文件包含进去。预处理命令通常应放在源程序的最前面。
●每一条语句都必须以分号结尾。但预处理命令、函数头和大括号“}”之后不能加分号。
●一条语句可以分开放在任意多行内;一行中也可以有多个语句。
●标识符及关键字彼此之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
1.2.3 C语言的字符集
字符是组成语言的最基本的元素。C语言字符集由字母、数字、空格、标点和特殊字符组成。在字符常量、字符串常量和注释中还可以使用汉字或其他可表示的图形符号。
●字母。小写字母a~z共26个,大写字母A~Z共26个。
●数字。0~9共10个。
●空白符。空格符、制表符、换行符等统称为空白符。空白符只在字符常量和字符串常量中起作用。在其他地方出现时,只起间隔作用,编译程序会忽略它们。因此在程序中使用空白符与否,对程序的编译不产生影响,但在程序中适当的位置使用空白符将使程序更具清晰性和可读性。
●标点和特殊字符。
1.2.4 C语言的词汇
在C语言中使用的词汇分为6类:标识符、关键字、运算符、分隔符、常量、注释符等。
1.标识符
在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。C语言规定,标识符只能是由字母A~Z、a~z,数字0~9和下划线“_”组成的字符串,并且其第一个字符必须是字母或下划线。
以下标识符是合法的:
a,x,_3x,BOOK_1,sum5
以下标识符是非法的:
3s 以数字开头
s*T 出现非法字符*
-3x 以减号开头
bowy-1 出现非法字符-(减号)
在使用标识符时还必须注意以下几点。
(1)标准C不限制标识符的长度,但它受各种版本的C语言编译系统限制,同时也受到具体机器的限制。例如在某版本C中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
(2)在标识符中大小写敏感,即是有区别的。例如,BOOK和book是两个不同的标识符。
(3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便阅读理解。
2.关键字
关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。C语言的关键字分为以下几类。
(1)类型说明符
类型说明符用于定义、说明变量、函数或其他数据结构的类型。如前面例题中用到的int、double等。
(2)语句定义符
语句定义符用于表示一个语句的功能。如【例1.4】中用到的if-else就是条件语句的语句定义符。
(3)预处理命令字
预处理命令字用于表示一个预处理命令。如前面各例中用到的include。
ANSI C提供的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 unsigned union void
volatile while
Turbo C扩充的11个关键字如下。
asm _cs _ds _es _ss cdecl
far huge interrupt near pascal
注意:在C语言中,关键字都是小写的。
3.运算符
C语言中含有相当丰富的运算符。运算符与变量,函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。运算符共有34种。C语言把括号、赋值、逗号等都作为运算符处理。从而使C语言的运算类型极为丰富,可以实现其他高级语言难以实现的运算。
C语言的34种运算符分类如下。
(1)算术运算符:+、-、*、/、%、++、--。
(2)关系运算符:<、<=、==、>、>=、!=。
(3)逻辑运算符:!、&&、||。
(4)位运算符:<<、>>、~、|、^、&。
(5)赋值运算符:=及其扩展。
(6)条件运算符:?:。
(7)逗号运算符:,。
(8)指针运算符:*、&。
(9)求字节数:sizeof。
(10)强制类型转换:(类型)。
(11)分量运算符:.、->。
(12)下标运算符:[ ]。
(13)其他:( )。
注意:各种运算符混合使用时,优先级与结合方法是难点。
4.分隔符
在C语言中采用的分隔符有逗号和空格两种。逗号主要用在变量定义、声明以及函数参数表中,分隔各个变量。空格一般用作间隔符,如在关键字、标识符之间必须要有一个以上的空格符作间隔,否则将会出现语法错误,例如,把“int a;”写成“inta;C”,编译器会把inta当成一个标识符处理,其结果必然出错。
5.常量
C语言中使用的常量可分为数字常量、字符常量、字符串常量、符号常量、转义字符等多种。
6.注释符
C语言的注释符是“/ *…* /”以及“//”。在“/ *”和“* /”之间的所有内容都是注释。“//”后面的一行是注释。程序编译时,不对注释做任何处理。注释可出现在程序中的任何位置。注释用来向用户提示或解释程序的意义。在调试程序中对暂不使用的语句也可用注释符括起来,使编译程序跳过此处不做处理,待调试结束后再去掉注释符。
7.控制语句
C语言中提供了9种控制语句,在程序中起到流程控制作用。
if-else switch for while do-while
continue break goto return