AVR单片机入门与速成攻略
上QQ阅读APP看书,第一时间看更新

2.2 语句

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

2.2.1 控制语句

C语言有9种控制语句,可分成以下三类:

  • 循环执行语句:while语句、do…while语句、for语句。
  • 条件判断语句:if语句、switch语句。
  • 转向语句:break语句、continue语句、return语句、goto语句。

1.while语句

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

while(表达式)
{
    语句1;
    语句2;
    …
    语句n;
}

while语句的执行过程是:首先判断“表达式”的值,当“表达式”的值为非0时,即开始顺序执行一次while语句中循环体中的语句,之后再次判断“表达式”的值,再进行下一次的循环,直至“表达式”的值为0时结束while循环。

while语句的特点是先判断表达式,后执行语句。在循环体中应该有使循环趋于结束的语句,否则循环会永不停止,形成死循环。while语句的用法如以下代码所示:

while(i--)
{
     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语句的运行过程如下:

图2-4 for语句的执行过程

1)首先求解“表达式1”。“表达式1”一般用于给循环初始变量赋值。

2)求解“表达式2”。如果其值为非0,就执行一次for语句中指定的循环语句;如果其值为0,则退出for循环。

3)求解“表达式3”。“表达式3”一般用于改变控制循环次数,使循环趋于结束。

4)返回第2步,执行下一次循环。

for语句的执行过程如图2-4所示。

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

void delay(unsigned int t)   //定义名为delay的子函数,无返回值,入口参数t
{
    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语句,又称为开关语句。其语句的一般形式为:

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语句的实际用法可以参考以下代码:

switch(keysc2)
{
     case 0xed:PORTD=table[4]; PORTC=0x01; beep();break;
     case 0xdd:PORTD=table[5]; PORTC=0x01; beep();break;
     case 0xbd:PORTD=table[6]; PORTC=0x01; beep();break;
     case 0x7d:PORTD=table[7]; PORTC=0x01; beep();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语句的用法可参考以下代码:

for(x=10;x>0;x--)
{
     …
     if(num<0) continue;     //如果num的值小于0,重新开始下一次for循环
     …
}

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

8.return语句

return语句用于把函数的值返回给主调函数。所谓函数的值,是指函数被调用后,执行函数体中的程序段所取得的并需要返回给主调函数的值。return语句的一般形式为:

return表达式;

或者为:

return(表达式);

该语句的功能是计算表达式的值,并返回给主调函数。return语句的实际用法可以参考以下代码:

unsigned char read_1byte(void)
{
     …
     if((PIND&0x10)==0x10)
     {
             TEMP=TEMP|0x01;
     }
     …
     return TEMP;     //将TEMP的值返回
}

9.goto语句

goto语句是一个无条件分支语句,用于将程序转移到指定的位置继续执行。goto语句的一般形式为:

goto  语句标号;

goto语句的具体用法可以参考以下代码:

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

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

2.2.2 其他语句

1.函数调用语句

函数调用语句由一个函数调用加一个分号构成,具体可参考以下代码:

delay(5);     //调用延时函数

2.复合语句

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

{
     PORTD=0x01;
     delay(100);
     PORTD=0x02;
     delay(100);
}

3.表达式语句

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

X+5;

4.空语句

空语句是只有一个分号的语句,它不执行任何的操作,一般作为循环语句中的循环体。空语句的使用可参考以下代码:

While(1);

以上代码中的分号即表示该循环中循环体为空语句。