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

上面的代码 , 居然 没有了花括 号,问题来了,此循环语句的“有效射程”究竟是多远,或者说, 此循环 语句的循环 区域在哪里。现在跟大家解开 这个谜团。 第一 行代码, wh ile(条件 )后面 “没有 分号” , 接着 第二 行就是“语句 1”, 所以,这种 情况跟 i f 语句省略花括 号的写法 是一样的, 此时循环体默 认只包含离 它最近 的一条且仅 仅一条的“语句 1 ” ,因此,上 述的语句 ,等效于下 面这种添加花 括号的…

100%1 / 836
第四十八节: while 循环语句。
【48.1 程序的“跑道”
经常听到这句话“程序跑起来了吗?,程序在哪里跑?有跑道吗?有的。循环语句就像一条椭圆的跑
道,程序在跑道上不停的跑,不知疲倦的跑,永无止境,一秒钟几百万圈的速度。单片机的 main 主函数内
往往有一条 while(1)语句,这就是单片机的“循环跑道”称之为主循环主循环内还可以继续嵌套多层 while
循环语句。
【48.2 while 循环的常见格式。
常见格式如下:
while(条件)
{
语句 1;
语句 2;
……
语句 N;
}
语句 N+1;
上面的“花括号内”称为“循环体内“花括号外称为“循环体外,现在来分析一下上述代码的执
行规律,如下:
(1) if 语句一样,先判断 while 的(条件)是否为真。如果为“假”,就不执行循环体“内”的“语句
1”“语句 N”直接跳到循环体“外”“语句 N+1”处开始往下执行如果为“真”才执行循环体“内”
语句 1”“语句 N”当执行完循环体“内”最后的语句 N时,单片机会突然返回到第一行代while(条
件)”处,继续判断循环的(条件)是否为真,如果为假就跳到循环体“外”的“语句 N+1”,表示结束了当
前循环。如果为真就继续从“语句 1“执行到“语句 N“,然后再返回 while(条件)处依次循环下去,直到
条件为假时才罢休,否则一直循环下去
(2)while(条件)语句中,条件判断真假的规则跟 if 语句一模一样,有两种类型一种是纯常量或者变
量类型的,只要此数值不等于 0 就认为是真,所以 while(1)也称死循环语句,因为里面的条件永远不为 0
对于死循环这样的语句,如果不遇到 break,return,goto 这些语句,那么就永远也别想跳出这个循环;另外
一种是关系判断,以及关系语句之间的像“与或”关系这类的判断。这些条件判断的真假,跟 if 语句的规
则是一样的,这里不再多讲。break,return,goto 这些语句后面章节会讲到
【48.3 while 省略花括号,没带分号。
while(条件)
语句 1;
语句 2;
……
语句 N;
语句 N+1;
上面的代码居然没有了花括号,问题来了,此循环语句的“有效射程”究竟是多远,或者说,此循环
语句的循环区域在哪里。现在跟大家解开这个谜团。第一行代码,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