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

/*---C 语言学习区 域的开始。 ----- ----------- ---------- ----------- ---------- */ unsigned c har a=0; //观 察这个数 最后的变化 unsigned c har b=0; //观 察这个数 最后的变化 unsigned c har i; // 控制循环体 的条件判断变 量 void main( ) //主函数 { i=3; while(i) / /i …

100%1 / 836
上面的代码居然没有了花括号,问题来了,此循环语句的“有效射程”究竟是多远,或者说,此循环
语句的循环区域在哪里。现在跟大家解开这个谜团。第一行代码,while(条件)后面“没有分号”接着第二
行就是“语句 1”,所以,这种情况跟 if 语句省略花括号的写法是一样的,此时循环体默认只包含离它最近
的一条且仅仅一条的“语句 1,因此,上述的语句,等效于下面这种添加花括号的写法:
while(条件)
{
语句 1;
}
语句 2;
……
语句 N;
语句 N+1;
【48.4 while 省略花括号,带分号。
while(条件);
语句 1;
语句 2;
……
语句 N;
语句 N+1;
这次的代码跟刚才“48.3”的代码唯一的差别是第一行代码,while(条件)后面“有分号”所以它循
环的有效范围就在第一行就结束了,不涉及“语句 1”。此时,等效于下面这种添加花括号的写法:
while(条件)
{
; //这里的分号代表一条空语
}
语句 1;
语句 2;
……
语句 N;
语句 N+1;
如果 while 的(条件)一直为“真”,单片机就一直在循环体内执行一条“无意”的空语句,相当于
“耗着”的状态,执行不到后面“语句 1”的语句,除非,条件为“假”才罢休才会跳出循环体。
循环体内什么都没有,只写一条“空语句”,这种写法在实际项目中也是有用武之地的,比如,等待某
件事是否满足条件,如果不满足,就一直死等死磕在这里,其它事情都干不了,这种“死等死磕”的做法,
专业术语叫“阻塞”,与之反面相对应的是另外一个词叫“非阻塞”。对于循环的“阻塞”用法老练的工程
师通常会多加一个超时的判断,这些内容大家暂时不用深入了解,后续章节我会讲到。
【48.5 例程练习和分析。
现在编写一个程序来熟悉一下 while 语句的书写和使用格式
程序代码如下:
/*---C 语言学习区域的开始。-----------------------------------------------*/
unsigned char a=0; //观察这个数最后的变化
unsigned char b=0; //观察这个数最后的变化
unsigned char i; //控制循环体的条件判断变
void main() //主函数
{
i=3;
while(i) //i 不断减小,直到变为 0 时才跳出此循环
{
a=a+1; //当 i 3 减少到 0 的时候,这条语句被循环执行了 3 次。
i=i-1; //循环的条件不断发生变化,不断减小
}
i=0;
while(i<3) //i 不断增大,当 i 大于或者等于 3 时才跳出此循环体
{
b=b+2; //当 i 0 增加 3 的时候,这条语句被循环执行了 3 次。
i=i+1; //循环的条件不断发生变化,不断增加
}
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
View(b); //把第 2 个数 b 发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
1 个数
十进制:3
十六进制:3
二进制:11
2 个数
十进制:6
十六进制:6
二进制:110
分析:
变量 a 3。a 初始化为 0,进入循环体内后,a 每次加 1,循环加 3 次,因此从 0 变成 3。
变量 b 6。b 初始化为 0,进入循环体内后,b 每次加 2,循环加 3 次,因此从 0 变成 6。
【48.6 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改C 语言学习区域”代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口 51 习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。