从单片机基础到程序框架(全集 2019pdf版).pdf - 第246页
void m ain() //主函 数 { //下面函数内 的 i 是普通局 部变量, 每次调用都会 被重新初始化 。 a=HanShu (); //函数内的 i 每次 重新初 始化为 0,再自加 1 ,所以 a 等于 1。 b=HanShu (); //函数内的 i 每次 重新初 始化为 0,再自加 1 ,所以 b 等于 1。 c=HanShu (); //函数内的 i 每次 重新初 始化为 0,再自加 1 ,所以 c 等于 1。 /…

还有以后讲到的定时器中断函数,等等。因为静态局部变量每次被调用都不会被重新初始化,用在这类函数
时就省去了每次初始化语句的时间。还有一类用途,就是那些规定不能被函数初始化的场合,比如在很多用
switch 搭建程序框架的函数里,这类 switch 程序框架俗称为状态机思路。
【57.5 能用全局变量替代静态局部变量吗?】
能用全局变量替代静态局部变量吗?能。哪怕在整个程序里全部用全局变量都可以。全局变量是一把牛
刀,什么场合都用牛刀虽然也能解决问题,但是显得鲁莽没有条理。尽量把全局变量,普通局部变量,静态
局部变量各自优势充分发挥出来才是编程之道。能用局部变量的尽量用局部变量,这样可以减少全局变量的
使用。当局部变量帮分担一部分工作时,最后全局变量只起到一个作用,那就是在各函数之间传递信息。局
部变量与全局变量的分工定位明确了,程序代码阅读起来就没有那么凌乱,思路也清晰很多。
【57.6 例程练习和分析。】
现在编写一个程序来熟悉 static 的性能。
/*---C 语言学习区域的开始。-----------------------------------------------*/
//函数的声明。
unsigned char HanShu(void);
unsigned char HanShu_static(void);
//变量的定义。
unsigned char a; //用来接收函数返回的结果。
unsigned char b;
unsigned char c;
unsigned char d;
unsigned char e;
unsigned char f;
//函数的定义。
unsigned char HanShu(void)
{
unsigned char i=0; //普通局部变量,每次函数调用都被初始化为 0.
i++; //i 自加 1
return i;
}
unsigned char HanShu_static(void)
{
static unsigned char i=0; //静态局部变量,只在上电是此初始化语句才起作用。
i++; //i 自加 1
return i;
}

void main() //主函数
{
//下面函数内的 i 是普通局部变量,每次调用都会被重新初始化。
a=HanShu(); //函数内的 i 每次重新初始化为 0,再自加 1,所以 a 等于 1。
b=HanShu(); //函数内的 i 每次重新初始化为 0,再自加 1,所以 b 等于 1。
c=HanShu(); //函数内的 i 每次重新初始化为 0,再自加 1,所以 c 等于 1。
//下面函数内的 i 是静态局部变量,第一次上电后默认为 0,就不会再被初始化,
d=HanShu_static(); //d 由 0 自加 1 后等于 1。
e=HanShu_static(); //e 由 1 自加 1 后等于 2。
f=HanShu_static(); //f 由 2 自加 1 后等于 3。
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
View(b); //把第 2 个数 b 发送到电脑端的串口助手软件上观察。
View(c); //把第 3 个数 c 发送到电脑端的串口助手软件上观察。
View(d); //把第 4 个数 d 发送到电脑端的串口助手软件上观察。
View(e); //把第 5 个数 e 发送到电脑端的串口助手软件上观察。
View(f); //把第 6 个数 f 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:1
十六进制:1
二进制:1
第 2 个数
十进制:1
十六进制:1
二进制:1
第 3 个数
十进制:1
十六进制:1
二进制:1

第 4 个数
十进制:1
十六进制:1
二进制:1
第 5 个数
十进制:2
十六进制:2
二进制:10
第 6 个数
十进制:3
十六进制:3
二进制:11
分析:
变量 a 为 1。
变量 b 为 1。
变量 c 为 1。
变量 d 为 1。
变量 e 为 2。
变量 f 为 3。
【57.7 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。