STM8实战
上QQ阅读APP看书,第一时间看更新

2.2 语句

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

2.2.1 控制语句

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

·循环执行语句: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语句的运行过程如下:

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

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

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

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

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

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

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);

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