《迷人的8051单片机》---3.2 语句

简介:

本节书摘来自华章出版社《迷人的8051单片机》一书中的第3章,第3.2节,作者高显生,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 语句

C语言用语句来向计算机发出操作指令。一个C语句经编译后,可以生成若干条机器指令,它是构成函数的基础。C语言的语句可以分为控制语句、函数调用语句、复合语句、表达式语句以及空语句等多种。以下我们主要介绍的是C语言的控制语句,这种语句具有相对固定的格式,用来实现某种特定的功能。

3.2.1 控制语句

C语言有9种控制语句,可分成以下3类:
1)循环执行语句: while语句、do…while语句、for语句。
2)条件判断语句:if语句、switch语句。
3)转向语句:break语句、continue语句、return语句、goto语句。

1. while语句

while语句是一个循环语句,用来控制程序段(即循环体)的重复执行,构成“当型”循环结构。while语句的常用形式为:

{
    语句1;
    语句2;
    … 
    语句n;
}```
while语句的执行过程是:首先判断“表达式”的值,当“表达式”的值为非0时,即开始顺序执行一次while语句内循环体中的语句,之后再次判断“表达式”的值,再进行下一次的循环,直至“表达式”的值为0时,结束while循环。
while语句的特点是先判断表达式,后执行语句。在循环体中应该有使循环趋于结束的语句,否则循环会永不停止,形成死循环。while语句的用法如以下代码所示:

{

num=num+i;    //循环体语句1
…            //循环体语句n

}`

2. do…while语句

do…while语句的特点是先执行循环体一次,再判断表达式的值,当“表达式”的值为非0时,则执行一次循环体中的语句,之后再判断“表达式”的值,并进行下一次的循环,直至“表达式”的值为“0”时结束。do…while语句的常用形式为:

do
{
    语句1;
    语句2;
    … 
    语句n;
}
while(表达式);
do…while语句的具体用法如以下代码所示:
do
{
    num=num+i;     //循环体语句1
        …         //循环体语句n
}
While(i--);```
####3. for语句
for语句是C语言中功能强大的循环语句,它的优点在于不仅适用于循环次数已经确定的情况,而且也可以用于未给出循环结束条件的情况。for语句的典型形式为:

for (表达式1;表达式2;表达式3)
{

语句序列;

}

for语句的运行过程如下:
1)首先求解“表达式1”。“表达式1”一般用作于给循环初始变量赋值。
2)求解“表达式2”。如果其值为非0,就执行一次for语句中指定的循环语句;如果其值为0,则退出for 循环。
3)求解“表达式3”。“ 表达式3”一般用于改变控制循环次数的量,使循环趋于结束。
4)返回第2步,执行下一次循环。
for语句的执行过程如图3-4所示。

![QQ_20170524095007](https://yqfile.alicdn.com/e29b1d937b10436ee02e05ca269d80fd6281ce69.png)

for语句的用法可以参考以下代码:

void delay(unsigned int t) //定义名为delay的子函数
{

unsigned int x;        //定义变量x 
for(x=t;x>0;x--)        //for循环
{
… 语句序列
}

}


上面的代码是由for循环语句构成的延时函数,当for循环执行后,先执行的是“x=t”,将参数t的值赋予变量x,然后判断“x>0”是否为真,为真,就执行花括号内的语句序列。执行完语句序列后,转而执行一次“x--”,让x的值自减1。完成上述任务后,重新判断“x>0”是否为真,从而开始下一次循环。
####4. if语句
if语句是一个条件语句,表达的意思是“如果……就……否则……”。if语句的典型写法是:

if (表达式)
{

语句序列1;

}
else
{

语句序列2;

}

if语句在执行时,首先对条件表达式进行求解,当条件表达式的结果为真时,就执行“语句序列1”的内容,否则就执行“语句序列2”的内容。需要注意的是,不要误认为if语句和else语句是两个部分,其实它们同属于一个if语句。else子句不能单独使用,它必须同if语句一起使用,但实际使用时可以省略else及后面的语句,这时if语句就可以简单地写成:

if (表达式)
{

语句序列;

}

这种形式的if语句执行过程是先求解表达式,当其为真时,就执行“语句序列”,当其为假时,就跳过该if语句,执行后面的其他语句。在if语句中,表达式通常都是用来判断两者关系的,表达式中使用的都是关系运算符,如>、< 、>= 、= =、<=和! = ,其运算结果只有“真”和“假”两种状态。
####5. switch语句
C语言中提供了一个专门用于处理多分支结构的条件选择语句,称为switch 语句,又称为开关语句。其语句的一般形式为:

{

case 常量表达式1: 语句1; break;
case 常量表达式2: 语句2; break;
case 常量表达式3: 语句3; break;
…
case 常量表达式n: 语句n; break;
default : 语句n+1;

}`
switch语句的执行过程是:首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case 后面的常量表达式相比较,若与某个常量表达式的值相等,就执行该case 后面的语句,执行语句时遇到break后就退出switch 语句;若圆括号中表达式的值与所有case 后面的常量表达式都不相等,则执行default 后面的语句n+1,然后退出switch语句。
使用switch 语句,还应注意以下几点:
1)default语句总是放在最后,当要求在没有符合的条件下不做任何处理时,则可以去掉default 语句。这时,若圆括号中表达式的值与所有case 后面的常量表达式的值都不相等,则直接退出switch语句。
2)如果在每一个case 后面包含多条执行语句时,语句之间用“;”号隔开;进入某个case 后,会自动顺序执行本case 后面的所有执行语句,直到遇到break 语句,才停止执行。
3)每一个case 后面的break 语句是可以省略的,如果break 语句被省略,程序会自动进入下一个case中继续执行语句,而不判断是否匹配,直到遇到break 语句,才停止执行。这是因为case 后面的常量表达式实际上只是一个开始执行处的入口标号,而不起条件判断作用。
switch语句的实际用法可以参考以下代码:

{
    case 0xee:WELA=1;P0=0x00;WELA=0;
              DULA=1;P0=table[0];DULA=0;
              break;
    case 0xde:WELA=1;P0=0x00;WELA=0;
              DULA=1;P0=table[1];DULA=0;
              break;
    case 0xbe:WELA=1;P0=0x00;WELA=0;
              DULA=1;P0=table[2];DULA=0;
              break;
    case 0x7e:WELA=1;P0=0x00;WELA=0;
              DULA=1;P0=table[3];DULA=0;
              break;
}```
####6. break语句
break语句可以用在循环语句和switch语句中,在循环语句中用来结束内部循环,在switch语句中用来跳出switch语句,break语句不能用在循环语句和switch语句之外的其他语句中。break语句的一般形式为:
``break;``
break语句的用法可参考以下代码:

for(x=10;x>0;x--) //定义10次的for循环
{

if(num<0) break; //如果num的值小于0,终止for循环

}

####7. continue语句
continue语句的作用是结束本次循环,忽略continue语句后面的语句,重新开始下一次的循环判定。其一般形式为:
``continue;``
continue语句的用法可参考以下代码:

{

if(num<0) continue; //如果num的值小于0,重新开始下一次for循环

}`
这里需要注意的是,break语句是不再判断循环的条件是否成立,结束整个循环结构,跳出循环体,开始执行循环语句后面的语句;continue语句只结束本次循环,转向下一次循环条件的判断,如果判断结果为真,则继续下一次循环,判断结果为假,则结束循环。

8. return语句

return 语句用于将函数的值返回给主调函数。所谓函数的值,是指函数被调用后,执行函数体中的程序段所取得的并需要返回给主调函数的值。return语句的一般形式为:
return 表达式;
或者为:
return (表达式);
该语句的功能是计算表达式的值,并返回给主调函数。return语句的实际用法可以参考以下代码:

unsigned char ReadOneChar(void)
{
    unsigned char i=0;
    unsigned char dat=0;
    for (i=8;i>0;i--)
    {
        …
    }
    return(dat); //将读出的数据返回
}

9. goto语句

goto语句是一个无条件分支语句,用于将程序转移到指定的位置继续执行。goto语句的一般形式为:
goto 语句标号;
goto语句的具体用法可以参考以下代码:

while(1)
{
… 
restart:                        //词句标号,指定程序跳转地点
…
if((temp<200)||(temp>800))  goto restart;    //条件成立,返回restart处
…
}

这里需要注意的是,过多地使用goto语句会造成程序结构上的混乱。

3.2.2 其他语句

1. 函数调用语句

函数调用语句由一个函数调用加一个分号构成,具体可参考以下代码:
delay(5); //调用延时函数

2. 复合语句

将多个语句组合起来,用 “{}”括起来,即可构成复合语句,其用法可参考以下代码:

{
    D1=0;          
    D2=1;
    delay_ms(500);  
    D1=1;
    D2=0;              
    delay_ms(500);   
}
3. 表达式语句

将一个表达式和一个分号组合在一起即构成表达式语句,具体可参考以下代码:
X+5;

4. 空语句

空语句是只有一个分号的语句,它不执行任何操作,一般作为循环语句中的循环体。空语句的使用可参考以下代码:
While(1);
以上代码中的分号即表示该循环中循环体为空语句。

相关文章
|
C语言
《迷人的8051单片机》——导读
电子与嵌入式系统设计丛书 迷人的8051单片机 高显生 编著 图书在版编目(CIP)数据 迷人的8051单片机/高显生编著. —北京:机械工业出版社,2016.8 (电子与嵌入式系统设计丛书) ISBN 978-7-111-54565-1 I.
2412 0