3.2常量与变量
在程序运行过程中,其值不能被改变的量称为常量。常量区分为不同的类型,如12、0
为整型常量,3.14、2.55 为实型常量,‘a’、‘b’是字符型常量。
例 1 符号常量的使用,在P1 口接有8 个LED,执行下面的程序:
#define LIGHT0 0xfe
#include “reg51.h”
void main()
{ P1=LIGHT0;
}
程序中用#define LIGHT0 0xfe 来定义符号LIGHT0 等于0xfe,以后程序中所有出现
LIGHT0 的地方均会用0xfe 来替代,因此,这个程序执行结果就是P1=0xfe,即接在P1.0
引脚上的LED 点亮。
这种用标识符代表的常量,称为符号常量。使用符号常量的好处是:
1.含义清楚。在单片机程序中,常有一些量是具有特定含义的,如某单片机系统扩展
了一些外部芯片,每一块芯片的地址即可用符号常量定义,如:
#define PORTA 0x7fff
#define PORTB 0x7ffe
程序中可以用PORTA、PORTB 来对端口进行操作,而不必写0x7ff、0x7fe。显然,这
两个符号比两个数字更能令人明白其含义。在给符号常量起名字时,尽量要做到“见名知意”
以充分发挥这一特点。
2、在需要改变一个常量时能做到“一改全改”。如果由于某种原因,端口的地址发生了
变化(如修改了硬件),由0x7fff 改成了0x3fff,那么只要将所定义的语句改动一下:
#define PORTA 0x3fff
即可,不仅方便,而且能避免出错。设想一下,如果不用符号常量,要在成百上千行程
序中把所有表示端口地址的0x7fff 找出来并改掉可不是件容易的事。
对于符号常量,初学者往往会和变量的概念混淆起来,它们之间有什么区别呢?
符号常量不等同于变量,它的值在整个作用域范围内不能改变,也不能被再次赋值。比
如下面的语句是错误的:
LIGHT=0x01;
值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元,
在该存储单元中存放变量的值。请注意变量名与变量值的区别,下面从汇编语言的角度对此
作一个解释。使用汇编语言编程时,必须自行确定RAM 单元的用途,如某仪表有4 位LED
数码管,编程时将3CH~3FH 作为显示缓冲区,当要显示一个字串“1234”时,汇编语言可
以这样写:
MOV 3CH,#1
MOV 3DH,#2
MOV 3EH,#3
MOV 3FH,#4
经过显示程序处理后,在数码管上显示1234。这里的3CH 就是一个存储单元,而送到
该单元中去的“1”是这个单元中的数值,显示程序中需要的是待显示的值“1”,但不借助
于3CH 又没有办法来用这个1,这就是数与该数据在地址单元的关系。同样,在高级语言
中,变量名仅是一个符号,需要的是变量的值,但是不借助于该符号又无法用该值。实际上
如果在程序中写上“x1=5;”这样的语句,经过C 编译程序的处理之后,也会变成“MOV
3CH,#5”之类的语句,只是究竟是使用3CH 作为存放x1 内容的单元还是其它如3DH,4FH
等作为存放x1 内容的单元,是由C 编译器确定的。
用来标识变量名、符号常量名、函数名、数组名、类型名等的有效字符序列称为标识符。
简单地说,标识符就是一个名字。
C 语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母
或下划线,要注意的是C 语言中大写字母与小写字母被认为是两个不同的字符,即Sum 与
sum 是两个不同的标识符。
标准的 C 语言并没有规定标识符的长度,但是各个C 编译系统有自己的规定,在Keil
C 编译器中可以使用长达数十个字符的标识符。
在 C 语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”。
初学者往往难于理解常量和变量在程序中各有什么用途,这里再举个例子加以说明。
前面的课程中我们多次用到延时程序,其中调用延时程序是这么写的:
mDelay(1000);
这其中括号中参数1000 决定了灯流动的速度,在这些程序中我们并未对灯流动的速度
有要求,因此,直接将1000 写入程序中即可,这就是常量。显然,这个数据是不能在现场
修改的,如果使用中有人提出希望改变流水灯的速度,那么只能重新编程、写片才能更改。
如果要求在现场有修改流水灯速度的要求,括号中就不能写入一个常数,为此可以定义
一个变量(如Speed),写程序时这么写:mDelay(Speed);然后再编写一段程序,使得Speed
的值可以被通过按键被修改,那么流水灯流动的速度就可以在现场修改了,显然这时就需要
用到变量了。
为整型常量,3.14、2.55 为实型常量,‘a’、‘b’是字符型常量。
例 1 符号常量的使用,在P1 口接有8 个LED,执行下面的程序:
#define LIGHT0 0xfe
#include “reg51.h”
void main()
{ P1=LIGHT0;
}
程序中用#define LIGHT0 0xfe 来定义符号LIGHT0 等于0xfe,以后程序中所有出现
LIGHT0 的地方均会用0xfe 来替代,因此,这个程序执行结果就是P1=0xfe,即接在P1.0
引脚上的LED 点亮。
这种用标识符代表的常量,称为符号常量。使用符号常量的好处是:
1.含义清楚。在单片机程序中,常有一些量是具有特定含义的,如某单片机系统扩展
了一些外部芯片,每一块芯片的地址即可用符号常量定义,如:
#define PORTA 0x7fff
#define PORTB 0x7ffe
程序中可以用PORTA、PORTB 来对端口进行操作,而不必写0x7ff、0x7fe。显然,这
两个符号比两个数字更能令人明白其含义。在给符号常量起名字时,尽量要做到“见名知意”
以充分发挥这一特点。
2、在需要改变一个常量时能做到“一改全改”。如果由于某种原因,端口的地址发生了
变化(如修改了硬件),由0x7fff 改成了0x3fff,那么只要将所定义的语句改动一下:
#define PORTA 0x3fff
即可,不仅方便,而且能避免出错。设想一下,如果不用符号常量,要在成百上千行程
序中把所有表示端口地址的0x7fff 找出来并改掉可不是件容易的事。
对于符号常量,初学者往往会和变量的概念混淆起来,它们之间有什么区别呢?
符号常量不等同于变量,它的值在整个作用域范围内不能改变,也不能被再次赋值。比
如下面的语句是错误的:
LIGHT=0x01;
值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元,
在该存储单元中存放变量的值。请注意变量名与变量值的区别,下面从汇编语言的角度对此
作一个解释。使用汇编语言编程时,必须自行确定RAM 单元的用途,如某仪表有4 位LED
数码管,编程时将3CH~3FH 作为显示缓冲区,当要显示一个字串“1234”时,汇编语言可
以这样写:
MOV 3CH,#1
MOV 3DH,#2
MOV 3EH,#3
MOV 3FH,#4
经过显示程序处理后,在数码管上显示1234。这里的3CH 就是一个存储单元,而送到
该单元中去的“1”是这个单元中的数值,显示程序中需要的是待显示的值“1”,但不借助
于3CH 又没有办法来用这个1,这就是数与该数据在地址单元的关系。同样,在高级语言
中,变量名仅是一个符号,需要的是变量的值,但是不借助于该符号又无法用该值。实际上
如果在程序中写上“x1=5;”这样的语句,经过C 编译程序的处理之后,也会变成“MOV
3CH,#5”之类的语句,只是究竟是使用3CH 作为存放x1 内容的单元还是其它如3DH,4FH
等作为存放x1 内容的单元,是由C 编译器确定的。
用来标识变量名、符号常量名、函数名、数组名、类型名等的有效字符序列称为标识符。
简单地说,标识符就是一个名字。
C 语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母
或下划线,要注意的是C 语言中大写字母与小写字母被认为是两个不同的字符,即Sum 与
sum 是两个不同的标识符。
标准的 C 语言并没有规定标识符的长度,但是各个C 编译系统有自己的规定,在Keil
C 编译器中可以使用长达数十个字符的标识符。
在 C 语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”。
初学者往往难于理解常量和变量在程序中各有什么用途,这里再举个例子加以说明。
前面的课程中我们多次用到延时程序,其中调用延时程序是这么写的:
mDelay(1000);
这其中括号中参数1000 决定了灯流动的速度,在这些程序中我们并未对灯流动的速度
有要求,因此,直接将1000 写入程序中即可,这就是常量。显然,这个数据是不能在现场
修改的,如果使用中有人提出希望改变流水灯的速度,那么只能重新编程、写片才能更改。
如果要求在现场有修改流水灯速度的要求,括号中就不能写入一个常数,为此可以定义
一个变量(如Speed),写程序时这么写:mDelay(Speed);然后再编写一段程序,使得Speed
的值可以被通过按键被修改,那么流水灯流动的速度就可以在现场修改了,显然这时就需要
用到变量了。