从单片机基础到程序框架(全集 2019pdf版) - 第243页

察到不同的 变量数值,详 细方法请看第 十一节 内容。

100%1 / 836
if(0==ChuShu) //如果除数等 0,就立即退出当前函数,并返回 0
{
return 0; // 退出当前函数并且返回 0.此时后面的代码不会被执行。
}
Shang=BeiChuShu/ChuShu; //除法运算的算法
return Shang; //返回最后的运算结果:商。并且退出当前函数
}
void main() //主函
{
a=ChuFa(128,0); //函数调用。128 除以 0,把商返回给 a 变量
b=ChuFa(128,2); //函数调用。128 除以 2,把商返回给 b 变量
View(a); //把 a 发送到电脑端的串口助手软件上观察。
View(b); //把 b 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
1 个数
十进制:0
十六进制:0
二进制:0
2 个数
十进制:64
十六进制:40
二进制:1000000
分析:
变量 a 0。
变量 b 64。
【56.7 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改C 语言学习区域”代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口 51 习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。
第五十七节: static 的重要作用。
【57.1 变量前加入 static 后发生的“化学反应”
有两类变量,一类是全局变量,一类是局部变量。定义时,在任何一类变量前面加 static 关键词,
变量原有的特性都会发生某些变化,因此,static 像化学的催化剂,具有神奇的功能。加 static 关键词的
书写格式如下:
static unsigned char a; //这是在全局变量前加的 static 关键词
void HanShu(void)
{
static unsigned char i; //这是在局部变量前加的 static 关键词
}
【57.2 在全局变量前加 static。
static 读作“静态全局变量前加 static,称为静态全局变量。静态全局变量和普通全局变量的功能
大体相同,仅在有效范围(作用域)方面有差异。假设整个工程有多个文件组成,普通全局变量的有效范围能
覆盖全部文件,在任何一个文件里以及跨文件与文件之间在传递信息的层面上都畅通无阻。而静态全局
变量只能在当前定义的那个文件里起作用,活动范围完全被限定在一个文件,彷佛被加了紧箍咒由不得你
任性,在传递信息的层面上仅仅局限于定义变量时所在的那一个文件。这部分的内容有个大致印象就可以,
暂时不用深入研究,等以后学到“多文件编程”时再关注,因为我当前的程序例子只有一个源文件,还没涉
及“多文件编程
【57.3 在局部变量前加 static。
这是本节重点。我常把局部变量比喻宾馆的客房客人入住时被分配在哪间客房是随机临时安排的
二天退房时宾馆会把客房收回继续分配给下一位其他的客人,是临时公共区。而加入 static 后的局部变量,
发生了哪些变化?加入 static 后的局部变量,称为静态局部变量。静态局部变量就像宾馆的 VIP 客户,VIP
客户财大气粗,把宾馆分配的客房永远包了下来,永远不许再给其它客人入住。总结了静态局部变量的两个
重要特性:
第一个,静态局部变量不会在函数调用时被初始化,只在单片机刚上电时被初始化了一次,因为它的
内存模型不是分配在“栈”,而是跟全局变量一样放在“全局数据区”拥有自己唯一的地址。因此,静态局
部变量的数值跟全局变量一样,具有“记忆”功能,你每次调用某个函数,函数内部的静态局部变量的数值
是维持最后一次被更改的数值,不会“清零的。但是跟全局变量又有差别,全局变量的有效范(作用
域)是整个工程,而静态局部变量毕竟是“局部”在传递信息的层面仅局限于当前函数内。而普通局部
量,众所周知,每次被函数调用时,都会被重新初始化,会被“清零”的,没有“记忆”功能的。
第二个,每次函数调用时,静态局部变量比普通局部变量少开销一条潜在的“初始化语句”,原因是普
通局部变量每次被函数调用时都要重新初始化,而静态局部变量不用进行这个操作。也就是说,静态局部变
量比普通局部变量的效率高一点,虽然这个“点”的时间开销微不足道,但是写程序时不能忽略这个“点”
静态局部变量用到好处之时,能体现一个工程师的功力。
【57.4 静态局部变量的应用场合。
静态局部变量适用在那些“频繁调用”的函数, main 函数主循环 while(1)里直接调用的所有函数,