首页 理论教育快速掌握C51基本语句!

快速掌握C51基本语句!

【摘要】:C语言的程序是由语句构成的,若干条语句有序地组织起来实现一定的功能。下面介绍常用的C语言语句。例如:1)空语句C语言程序中有一个特殊的表达式语句,称为空语句。

C语言的程序是由语句构成的,若干条语句有序地组织起来实现一定的功能。C语言程序有三种基本结构,即顺序结构、选择(分支)结构和循环结构。

(1)顺序结构:程序自上向下逐条顺序执行。

(2)选择(分支)结构:根据表达式的值选择执行不同分支的程序。

(3)循环结构:程序执行中根据某一条件的存在重复执行同一部分,直到条件不满足时终止循环操作。

C语言提供了多种语句实现这些程序结构。下面介绍常用的C语言语句。

4.4.1 表达式语句和复合语句

1.表达式语句

表达式语句是最基本的语句,语句中没有关键词。

表达式语句由个表达式和一个分号“;”构成,其一般格式如下:

执行表达式语句即是计算表达式的值。例如:

1)空语句

C语言程序中有一个特殊的表达式语句,称为空语句。空语句只有一个“;”,它的功能是什么也不做,但执行它和执行其他语句一样,需要占用CPU一定的时间,因此常用于延时。

2)函数调用

函数调用是调用已经定义的函数(或内置的库函数),由函数名、实际参数表加上分号“;”组成。其一般形式为:

执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数。然后,执行被调用函数体中的语句。例如,前面程序中延时函数delay()的调用。

2.复合语句

用“{}”将一组语句括起来就构成了复合语句。例如:

是一条复合语句。复合语句内的各条语句都必须以分号“;”结束,但在括号“}”外不能加分号。

4.4.2 选择语句

选择(分支)语句是判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的操作之一。

1.基本if语句

基本if语句的一般格式如下:

if语句的功能是:如果“表达式”的结果为“真”,则执行花括号内的语句组。否则,跳过语句组继续执行其下面的语句。

基本if语句的执行流程图如图4-46所示。

图4-46 基本if语句执行流程图

if语句中的“表达式”可以是任何形式的表达式,常用的是逻辑表达式或关系表达式。只要表达式的值“非0",即可执行花括号内的语句组。例如,以下语句都是合法的。

if语句中的“表达式”必须用“()”括起来。

if语句中的语句组如果只有一条语句,“{}”可以省略;若语句组有多条语句,则必须用“{}”括起来。这一点,初学者在使用中容易出错。

例如,模拟汽车转向灯的控制,可以通过下面操作实现。

【实训4.2】用if语句实现对模拟汽车转向灯的控制。参考程序:

2.if-else语句

i f-else语句的一般格式如下:

if-else语句的功能是:如果“表达式”的值为“真”,则执行语句组1;如果“表达式”的值为“假”,则执行语句组2。if-else语句的流程图如图4-47所示。

图4-47 if-else语句的流程图

3.if-else-if语句

if-else-if语句是多分支语句,它的一般格式如下:

从if-else-if语句格式中可以看出,它是if-else语句的嵌套,构成多分支的选择结构,其流程图如图4-48所示。

图4-48 if-else-if语句的流程图

【实训4.3】利用if-else-if语句实现对模拟汽车转向灯的控制。参考程序:

4.switch语句

if语句一般用于条件判断或分支数目较少的场合,如果if语句嵌套层数过多,就会降低程序的可读性。C语言提供了一种专门用于完成多分支选择的语句switch,其一般格式如下:

该语句执行过程如下:计算“表达式”的值,并逐个与case语句后的“常量表达式”的值相比较,当“表达式”的值与某个“常量表达式”的值相等时,则执行相应“常量表达式”的语句组,然后,执行break语句,退出switch语句,继续执行其后面的语句。如果“表达式”的值与所有case语句后的“常量表达式”的值均不相同,则执行default后面的语句组n+1。

switch语句中的case语句后面必须是一个“常量表达式”。

不能将break语句省略,否则程序将会顺序往下执行下去,出现程序的逻辑错误。

【实训4.4】利用switch语句控制P0端口的8位LED灯,通过检测按键按下的次数,选择点亮不同位置的LED灯(通过1位按键控制8位LED灯流水运行)。

实训4.4电路图如图4-49所示。它是在图4-40的基础上增加了一位按键,连接在P2.0端口上。

图4-49 1位按键控制8位流水灯的电路图

设置按键次数计数变量keynum,当keynum=1时,P1=0xfe,点亮P0.0连接的LED灯;当keynum=2时,P1=0xfd,点亮P0.1连接的LED灯……当keynum=8时,P1=0x7f,点亮P0.7连接的LED灯。否则,P0=0xff,8位LED灯灭。

其流程图如图4-50所示。

图4-50 1位按键控制8位流水灯运行流程图

源程序如下:

(www.chuimin.cn)

switch语句应用的关键是根据控制要求设计case表达式。

1位按键控制8位流水灯运行Proteus仿真图如图4-51所示。

图4-51 1位按键控制8位流水灯运行Proteus仿真图

扩展训练:

在实训4.4原理图的基础上,改变控制效果:检测到按键第1次按下,让8位LED灯自左至右流水移动一次;检测到按键第2次按下,让8位LED灯自右至左流水移动一次;检测到按键第3次按下,让8位LED同时闪烁5次;检测到按键第4次按下,让8位LED灯自中间两位向两边移动;检测到按键5~8次按下的效果,自行设定。

4.4.3 循环语句

循环语句是用于实现需要反复执行多次的操作。利用循环语句控制需要重复多次完成的操作,可以使用程序结构清晰明了,而且编译的效率大大提高。在C语言中构成循环的语句有while语句,do while语句和for语句。

1.while语句

while语句的一般格式如下:

while语句执行时首先判断表达式,当表达式为“真”(非0)时,则执行循环体中的语句组;否则,跳过循环体,执行下一条语句。所以,while语句常常被称为“当型”循环。while语句执行流程图如图4-52所示。

图4-52 while语句执行流程图

注意:while语句中的“{}”是不能省略的。

前面的任务和实训项目中均用到了while语句,这些应用中表达式均为“真”,即while(1)语句构成的循环是无限次循环。

分析下列程序实现了什么功能?

2.do while语句

do while语句的一般格式如下:

do while语句首先执行循环体中的语句组,然后判断while语句表达式是否为“真”,若为“真”,则继续执行循环体中的语句组,直到判断表达式为“假”,跳出循环体,执行do while语句的下一条语句。do while语句执行的流程图如图4-53所示。

图4-53 do while语句执行流程图

它与前面的while语句的区别是首先执行一次循环体中的语句组,然后再执行判断表达式是否为“真”。

3.for语句

for语句可以使程序按照指定的次数重复执行一个语句。其格式如下:

for语句的执行过程如下:首先,给循环变量赋初值;然后,判断循环条件,如果其值为“真”,则执行循环体语句部分;修改循环变量,再与循环条件进行比较,若为“真”,继续执行循环体语句组,否则,执行for循环语句的下一条语句。for语句执行的流程图如图4-54所示。

for语句常用在循环次数确定的情况下。循环变量赋初值只执行一次;循环体语句组部分要执行若干次,具体执行次数由循环条件决定。当for语句中的循环体语句组只有一条语句时,“{}”可以省略。

前面项目和实训中多次用到的delay()函数就是由for语句构成的,例如:

图4-54 for语句执行流程图

延时函数在调用时,若实际参数值为200,则for语句及其后面的空语句“;”循环体执行200次。每条语句的执行都需要一定的时间(µs级),延时函数的延时时间是通过for语句多次重复执行实现的。若希望延时时间更长,在定义的数据类型表示范围内,实际参数取值大些即可。

省略表达式的for语句:

其中,for语句中只有两个分号,三个表达式全部为空语句。没有设置循环变量,不判断循环条件,不修改循环变量,无休止地执行循环体。它的功能相当于while(1)语句。

只有一条循环语句构成的循环称为单重循环。上面的延时函数是由for语句构成的单重循环。

4.循环的嵌套

一个循环体内可包含另一个完整的循环结构,内嵌的循环中还可以嵌套循环,这就是多层循环。以下廷时函数是由两条for语句构成的两层循环,也称为双重循环。

前一条for语句为外循环控制语句,后一条foe语句为内循环控制话句。外循环每执行一次,内循环都要执行125次。若外循环参数ms取值为1000,则内循环执行1000×125次,双重循环可以使延时时间更长。

实际应用中,while、 do while和for语句可以处理相同的问题,它们功能可以互相替代,三种循环语句可以互相嵌套。实训4.1中,使用是在while返句构式循环中包含了for语句构成的循环,构成了双重循环。

凡用while循环能完成的,用for循环都能实现,for语句的功能更强。用while和do while循环时,循环变量初始化的操作应在while和do while语句之前完成。

while循环、dowhile循环和for循环都可以用break语句跳出循环,用continue语句结束本次循环。

5.break语句和continue语句

1)break语句

循环体中使用break语句可以使程序从循环体内跳出,执行循环体的下一条语句。一般格式如下:

break语句不能用于循环语句和switch语句之外的任何其他语句中。例如,下列程序段的执行。

当程序循环到i=51时,执行break语句,跳出for循环,执行j=i操作。

2)continue语句

continue语句的作用为结束本次循环,即跳过循环体中尚未执行的语句,进行下一个是否执行循环的判定,一般格式如下:

例如,下列程序段的执行。

当程序循环到i=51时,执行continue语句,结束本次循环,即不执行下面的j=i语句,而执行i++,即i=52,执行i<100,循环的条件成立,循环继续执行,直到i<100的条件不成立时,for循环才终止。

continue 语句和break语句的区别,continue 语句只结束本次循环,而不是要终止整个循环的执行。break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立。

【实训4.5】P0端口连接8位LED灯,要求其控制状态:8位LED灯先流水运行5次,然后转换为8位灯闪烁10次,两种状态依次循环运行。原理图参照任务4.3的图4-40。

分析:实训要求将8位LED灯流水控制和闪烁控制包含在一个控制程序中,并实现指定控制次数。循环控制可以使用while、do while和for语句,但限定循环次数的控制利用for语句更为方便。

(1)流水循环的5次控制,利用for语句循环变量Loopl控制。

(2)8位流水灯移动控制,利用for语句循环变量shift控制。

(3)8位LED灯闪烁10次控制,利用for语句循环变量Loop2控制。

(4)两种状态的循环进行是无限次的,通过while (1)控制。

源程序如下: