第6章C语言的标识符、关键字和数据类型6.1标识符和关键字标识符是用来标识源程序中某个对象的名字的,这些对象可以是语句、数据类型、函数、变量、常量、数组等。一个标识符由字符串、数字和下划线等组成,第一个字符必须是字母或下划线,通常以下划线开头的标识符是编译系统专用的,因此在编写C语言源程序时一般不要使用以下划线开头的标识符,而将下划线用作分段符。C51编译器规定标识符最长可达255个字符,但只有前面32个字符在编译时有效,因此在编写源程序时标识符的长度不要超过32个字符,这对于一般应用程序来说已经足够了。C语言是大小写敏感的一种高级语言,如果我们要定义一个时间“秒”标识符,可以写做“sec”,如果程序中有“SEC”,那么这两个是完全不同定义的标识符。关键字则是编程语言保留的特殊标识符,有时又称为保留字,它们具有固定名称和含义,在C语言的程序编写中不允许标识符与关键字相同。与其他计算机语言相比,C语言的关键字较少,ANSIC标准一共规定了32个关键字,见表6-1。关键字用途说明auto存储种类说明用以说明局部变量,缺省值为此break程序语句退出最内层循环体case程序语句switch语句中的选择项char数据类型说明单字节整型数或字符型数据const存储类型说明在程序执行过程中不可更改的常量值continue程序语句转向下一次循环default程序语句switch语句中的失败选择项do程序语句构成do…while循环结构double数据类型说明双精度浮点数else程序语句构成if…else选择结构enum数据类型说明枚举extern存储种类说明在其他程序模块中说明了的全局变量float数据类型说明单精度浮点数for程序语句构成for循环结构goto程序语句构成goto转移结构if程序语句构成if…else选择结构int数据类型说明基本整型数long数据类型说明长整型数register存储种类说明使用CPU内部寄存的变量return程序语句函数返回short数据类型说明短整型数signed数据类型说明有符号数,二进制数据的最高位为符号位sizeof运算符计算表达式或数据类型的字节数static存储种类说明静态变量struct数据类型说明结构类型数据switch程序语句构成switch选择结构typedef数据类型说明重新进行数据类型定义union数据类型说明联合类型数据unsigned数据类型说明无符号数据void数据类型说明无类型数据volatile数据类型说明该变量在程序执行中可被隐含地改变while程序语句构成while和do…while循环结构表6-1ANSIC标准一共规定了32个关键字KeilC51编译器的关键字除了有ANSIC标准的32个关键字外还根据51单片机的特点扩展了相关的关键字。在KeilC51开发环境的文本编辑器中编写C程序,系统可以把保留字以不同颜色显示,缺省颜色为蓝色。表6-2为KeilC51编译器扩展的关键字。关键字用途说明bit位标量声明声明一个位标量或位类型的函数sbit位变量声明声明一个可位寻址变量sfr特殊功能寄存器声明声明一个特殊功能寄存器(8位)sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器data存储器类型说明直接寻址的8051内部数据存储器bdata存储器类型说明可位寻址的8051内部数据存储器idata存储器类型说明间接寻址的8051内部数据存储器pdata存储器类型说明“分页”寻址的8051外部数据存储器xdata存储器类型说明8051外部数据存储器code存储器类型说明8051程序存储器interrupt中断函数声明定义一个中断函数reetrant再入函数声明定义一个再入函数using寄存器组定义定义8051的工作寄存器组表6-2KeilC51编译器扩展的关键字6.2在51MCUDEMO试验板上实现:使右侧4个LED数码管从左至右显示“1234”6.2.1实现方法第1步:向P0口送“4”的字形码,向P2口送数0xfe以点亮个位数码管,延时2mS维持数码管点亮状态;第2步:向P0口送“3”的字形码,向P2口送数0xfd以点亮十位数码管,延时2mS维持数码管点亮状态;第3步:向P0口送“2”的字形码,向P2口送数0xfb以点亮百位数码管,延时2mS维持数码管点亮状态;第4步:向P0口送“1”的字形码,向P2口送数0xf7以点亮千位数码管,延时2mS维持数码管点亮状态。重复执行以上第1~4步,即可在数码管上得到稳定清晰的显示。6.2.2源程序文件在D盘建立一个文件目录(CS6-1),然后建立CS6-1.uv2的工程项目,最后建立源程序文件(CS6-1.c)。输入下面的程序:#includeREG51.H//1unsignedchardis0=0x99;//2unsignedchardis1=0xb0;//3unsignedchardis2=0xa4;//4unsignedchardis3=0xf9;//5/*=====================6===============*/voiddelay(void)//7{//8unsignedinti,j;//9for(i=0;i2;i++)//10{//11for(j=0;j121;j++)//12{;}//13}//14}//15//=====================16===========voidmain(void)//17{//18while(1)//19{//20P0=dis0;//21P2=0xfe;//22delay();//23P0=dis1;//24P2=0xfd;//25delay();//26P0=dis2;//27P2=0xfb;//28delay();//29P0=dis3;//30P2=0xf7;//31delay();&,amp;nb,sp;//32}//33}//34图6-1为keilc51软件编译时的界面,下部的输出窗口显示0错误、0警告。51MCUDEMO试验板接通5V稳压电源,将生成的CS6-1.hex文件下载到试验板上的单片机89S51中,注意,标示“LEDMOD_DATA”及“LEDMOD_COM”的双排针应插上短路块。我们发现右侧4个LED数码管从左至右清晰显示“1234”。图6-1keilc51软件编译时的界面6.2.3程序分析解释序号1:包含头文件REG51.H。序号2:定义无符号字符型变量,其标识符为dis0,并赋初值0x99。序号3:定义无符号字符型变量,其标识符为dis1,并赋初值0xb0。序号4:定义无符号字符型变量,其标识符为dis2,并赋初值0xa4。序号5:定义无符号字符型变量,其标识符为dis3,并赋初值0xf9。序号6:程序分隔。序号7:定义函数名为delay的延时子函数(延时长度约为2mS),其标识符为delay。序号8:delay延时子函数开始。序号9:定义两个无符号整形变量i,j。序号10~14:两个for语句循环体,作用是延时。序号15:delay延时子函数结束。序号16:程序分隔。序号17:定义函数名为main的主函数,其标识符为main。序号18:main的主函数开始。序号19:while循环语句,这里进行无限循环。序号20:while循环语句开始。序号21:将dis0变量(显示4)送往P0口。序号22:P2口送数0xfe,目的是点亮个位数码管。序号23:调用延时子函数模块,维持点亮时间,便于观察。序号24:将dis1变量(显示3)送往P0口。序号25:P2口送数0xfd,目的是点亮十位数码管。序号26:调用延时子函数模块,维持点亮时间,便于观察。序号27:将dis2变量(显示2)送往P0口。序号28:P2口送数0xfb,目的是点亮百位数码管。序号29:调用延时子函数模块,维持点亮时间,便于观察。序号30:将dis3变量(显示1)送往P0口。序号31:P2口送数0xf7,目的是点亮千位数码管。序号32:调用延时子函数模块,维持点亮时间,便于观察。序号33:while循环语句结束。序号34:main的主函数结束。可见我们定义的数据类型、函数、变量等均未与C语言的关键字发生冲突。下面我们做一下修改,将dis0改为do,将delay改为switch。再进行编译、连接,结果出现了一大堆的错误(见图6-2)。因此切记,在程序编写中不允许标识符与C语言的关键字相同。图6-2出现了一大堆的错误