1.2 C语言程序的语法
在具体学习C语言程序和程序设计方法之前,为了使大家能够对C语言编程有一个更加感性的认识,请先来初步分析以下程序。
【例1-1】在屏幕上输出一个字符串。
/ *源程序1-1.C* / #include <stdio.h> void main() { printf( "This is my first C program! \n " ) ; }
在以上方框中出现的代码就是我们要学习的第一个程序。如果将以上方框中的字符用键盘逐一输入计算机并编译执行后,就会在计算机屏幕上显示以下字符:
This is my first C program!
说明:
①程序的第1行是一条预处理包含命令“#include <stdio.h>”。它的功能是:要求编译器在对程序进行预处理时,将头文件stdio.h的代码嵌入到程序中。由于在头文件stdio.h中包含有关于标准输入/输出函数的定义,因此,如果要在程序中使用printf()等函数就必须在程序中嵌入该语句。
②程序的第2行到第5行定义了一个函数main。第3行到第5行由一对花括号{ }所括起来的部分,称为函数体。
③在本例的函数体中只有一条语句,这就是:
printf( " This is my first C program! \n " ) ;
其中,printf函数是系统预定义的一个标准输出函数。它的功能正如在程序运行中所看到的那样,是在屏幕上显示由双引号所括起来的那个字符串(即“This is my first C program! \n”)。
④如果仔细比较屏幕输出的字符串和程序语句中的原字符串的话可以发现,两者之间有一些小小的差别。那就是——在原字符串中的“\n”并没有显示在屏幕上。这是因为“\n”是C语言中的一个专用控制符,它表示“换行”(严格地讲,应写成“\n”),即将输出光标移到屏幕的下一行,以便输出其他内容。
为了能真正理解以上程序的功能,请大家试着将原语句printf()改为:
printf( "\n This is my first C program! \n " ) ;
或
printf( "\n This is \n my first C program! \n " ) ;
请大家先试着写出程序的结果,再实际运行程序并将结果进行比较。
⑤语句(statement)是组成C程序的基本单位。每条语句必须用分号(;)作为结束符。
⑥在最后需要强调的是,函数是C语言中一个十分重要的概念。
在一个函数中可以包含一条或多条语句。函数正是通过这些语句的不同组合来实现不同的功能,而不同的函数则进一步组合以实现更为强大的程序功能。在本例的程序代码中,就出现了两个函数:main和标准输出函数printf。其中的函数main是C语言中一个十分特殊的函数,在任何C语言程序中都必须有并且只能有一个main函数,任何C语言程序总是从该函数的第一条语句开始执行。
【例1-2】计算矩形的周长和面积。
/ *源程序1-2.C* / #include <stdio.h> void main() { float width,hight,girth,area; / * 定义四个实型变量width,hight,girth,area * / printf( " Enter width and hight : " ); scanf("%f%f",&width,&hight); / * 输入width,hight * / girth=2*(width+hight) ; area=width*hight; / * 计算矩形的面积和周长 * / printf("周长=%f,面积=%f\n",girth,area); / * 输出面积和周长 * / }
程序运行的结果为:
Enter width and hight: 3.0 5.0 周长=16.0,面积=15.0
说明:
①本程序的功能是:计算矩形的周长和面积,并将计算结果存入变量girth和area中。
②程序第5行是一个说明(声明,declaration),定义了4个变量。所谓变量,就是程序向系统申请的一块用于存放特定类型数据的存储区。在本例中的程序行“float width, hight, girth, area;”,表示向系统申请4块存储区用以存放4个实型(float)变量,并将这4个变量分别命名为:width, hight, girth, area。
③程序第7行是一条输入语句,其功能是:接收从键盘输入的2个数据并存入变量width和hight中。其中,scanf与printf一样也是预定义的标准输入输出函数。因此,在使用前同样必须包含“#include <stdio.h>”命令。
④程序第8行计算width、hight之和的2倍并存入girth。第10行输出程序运行的结果。
⑤在程序中,用“/ *”和“* /”所括起来的部分,称为注释。在程序中使用注释的唯一目的是为了对程序进行注解和说明,以使程序易于阅读和理解。也就是说,注释是写给程序员看的,是与机器运行无关的。注释并不是C语言语句的一部分。在编译时,编辑器会自动忽略这些注释部分。
1.2.1 C语言的字符集、词汇和语句
在本节中,将主要介绍C语言的词法记号,主要包括:字符集、标识符、关键字、运算符、分隔符和空白符等相关知识。
(1)C语言的字符集
在C语言中,所允许使用的全部合法字符的集合称为C字符集。这主要包括:
·大写英文字母:A~Z。
·小写英文字母:a~z。
·数字字符:0~9。
·特殊字符:
空格 ! # % & * ' " + - = ~ < > / \ | , . ; : ? () [] {} _(下画线)
其他还包括:空字符(NULL)及空格符、回车符、换行符、控制符等不可打印字符。
(2)词法记号
词法记号是由若干字符组成的具有一定意义的最小词法单元,又称为单词(word)。在C语言中共有五种词法记号,现重点介绍三种。
①标识符 标识符(identifier)是由程序员自己定义的单词,用于命名程序中的一些实体。例如变量、常量、函数、语句标号和数据类型等。在C语言中规定,标识符只能由大/小写英文字母、数字(0~9)和下画线组成,并且第一个字符必须是字母或下画线。
在命名C语言的标识符时应注意:
·标识符的长度(即组成标识符的字符个数)在语法上可以是任意的。但是,在特定的编译系统中可能会有一定的限制。
·C语言大小写是有区别的。也就是说在C程序中,abc、ABC和aBc分别代表三个不同的标识符。而一般来说,变量名和函数名中的英文字母一般小写。
·在用户定义标识符时,不能使用系统已经预定义的保留字。保留字是指系统中已经预定义的标识符,它包括关键字和设备字等。
·在定义标识符时,除了注意其合法性外,还应当尽量使用有意义的单词作为标识符,以便“见名知意”,方便阅读和理解。例如,表示平均值常用avg或者average,年份常用year,月份常用month。
例如,以下这些都是合法的C语言标识符:
sum, year,_45,name,student,businessl
而以下这些则是不合法的C语言标识符:
a-b(出现非法字符),#123(非法字符打头),6k(数字打头),float(关键字)
②关键字 关键字(keyword)是指在C语言中已经由系统预定义的具有特定含义的标识符。在C语言中共有32个关键字(见附录C),这些关键字全部用小写英文字母表示,并且不允许用作其他用途。
③运算符 运算符是用来表示某种运算的特殊符号。C语言中的运算符主要包括:
+ - * / % > < >= <= == != && || ! << >> ~ | & = (及扩展赋值运算符) ?: , * & sizeof (类型) . -> []
需要注意的是:在上述这些运算符中,有的运算符可能具有双重含义。例如,“*”既可以作为算术运算符表示乘法操作,也可以作为指针运算符表示指针操作。因此,在程序中要注意加以区分,不能混淆。
(3)语句
程序中执行部分最基本的单位是语句。
C语言的语句可分为5类。
①表达式语句 任何表达式末尾加上分号即可构成表达式语句。
②函数调用语句 由函数调用加上分号即组成函数调用语句。
③控制语句 用于控制程序流程,由专门的语句定义符及所需的表达式组成。主要有条件判断执行语句、循环执行语句、转向语句等。
④复合语句 由{}把多个语句括起来组成一个语句。复合语句被认为是单条语句,它可出现在所有允许出现语句的地方,如循环体等。
⑤空语句 仅由分号组成,无实际功能。
在程序编译的词法分析阶段,编译器会将正文分解为词法记号和空白两部分。空白是空格、制表符(按“Tab”键产生的字符)、换行符(按“Enter”键产生的字符)和注释的总称。空白在程序中的作用,是指示词法记号的开始和结束。除此功能之外,空白在编译时将会被自动忽略。
1.2.2 数据类型
C语言提供了丰富的数据类型,数据类型是一个值的集合以及定义在这个值集上的一组操作。在程序中,不同的数据类型有不同的存储长度和不同的取值范围,同时,对于不同的数据类型也会进行不同的操作。数据类型是按数据的性质、表示形式、占据存储空间的多少、构造特点来划分的。在C语言中的数据类型如图1-1所示,C语言中没有无类型的数据,也不可能有一个数据同时具有多种数据类型。
图1-1 C语言中的数据类型及分类关系
1.2.3 常量和变量
(1)常量
在程序运行过程中,其值是不会变化的量称为常量(constant)。常量在程序中不必进行任何说明就可以使用。
C语言中有5种常量类型:整型常量、实型常量、字符常量、字符串常量和符号常量。
①整型常量,在程序中可以用3种形式表示:十进制整型常量、八进制整型常量和十六进制整型常量。
②实型常量,有2种形式:十进制数形式和指数形式。
③字符常量,代表ASCII码字符集里的一个字符,在程序中要用单撇号括起来,如字符常量a在程序中要用'a'表示,以便与一般的用户标识符区别。
④字符串常量,是由一对双引号括起来的字符序列,如字符串常量“a1b2c3”。
⑤符号常量,是由#define命令定义的常量。其一般形式为:
#define 标识符 常量 / * 由于它不是C语句,故行末不用分号 * /
其中#define是一条预处理命令(预处理命令都以“#”开头),又称为宏定义命令,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均以该常量值代之。例如:
#define PI 3.1415926
定义一个名为PI的符号常量,代表常量3.1415926。当编译程序预处理遇到PI时,就用标识符后的常量替换该标识符。
习惯上,符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。
(2)变量
变量(variable)的值在程序运行中是允许改变的,本质上是内存中一个取了名字的存储区域。变量的名字即变量名。
根据变量值类型的不同,C语言中的变量可分为整型变量、浮点变量、字符变量、枚举变量等。C语言中变量使用规则如下:
变量必须先定义,后使用。定义一个变量后,系统就会为其分配一个存储区域。
注意,变量名和变量值是有区别的,变量名是该变量所代表的存储单元的标志,而变量值是指存储单元中的内容在程序中,我们可以根据需要使用变量的值和变量的地址(即存储区域所在的编号)。
C语言允许定义变量时赋予初值,称变量初始化,以便使用变量。