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);
以上代码中的分号即表示该循环中循环体为空语句。