知识链接
一、运算符
数据运算是程序运行中重要的基础操作。在C51中,用特定的符号来表达在数据对象上进行的运算操作,这些符号就是运算符,参加运算操作的数据对象(常量、变量或函数)被称为操作数。运算符和操作符连接起来组成表达式,用于表达对数据进行的处理。为了能在程序中表达对数据的运算处理,必须理解运算符的运算规则和各种约束条件。
1.算术运算符
C51语言中的算术运算符见表3-3-1。
上面运算符中加、减、乘、除为双目运算符,它们要求有两个运算对象。对于加、减和乘运算符合一般的算术运算规则。而除法运算有所不同:如果两个整数相除,其结果为整数,舍去小数部分,如10/3=3,2/5=0;取余运算要求两个运算对象均为整型数据,如10%3=3。
表3-3-1

用算术运算符将运算对象连接起来的式子称为算术表达式。算术表达式一般格式为:
表达式1 算术运算符 表达式2
例如:x+y/(a+b) (a+b)*(x+y)
C51语言中规定了运算符的优先级和结合性。在求一个表达式的值时,要按运算符的优先级别进行。算术运算符中取负值的优先级最低。需要时可在算术表达式中采用圆括号来改变运算符的优先级。
2.赋值运算符
赋值运算符(=),在C51中的功能是给变量赋值。它的作用是将一个数据赋给一个变量。
例如:a=3;//把常数3赋给变量a
由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式。其一般格式为:
变量 赋值表达式 表达式
如i=5;是一个赋值表达式,其求解过程是:将赋值运算符右侧表达式的值赋给左侧的变量。赋值表达式的值就是被赋值变量的值。i=5,这个赋值表达式的值为5(变量i的值也为5)。
赋值表达式中的“表达式”,还可以是另一个赋值表达式。
例如:a=(b=10);
括号内的“b=10”是一个赋值表达式,它的值是10,“a=(b=10)”相当于“b=10”和“a=10”两个赋值表达式,因此a的值等于10,整个表达式的值也等于10。
3.自增、自减运算符
C51语言中除了基本的加、减、乘、除运算符之外,还提供一种特殊的运算符:
+ + //自增运算符
- - //自减运算符
自增和自减运算符的作用是使变量加1或减1。
+ +i 使用i的值之前先使i加1,然后再使用i的值;
- -i 使用i的值之前先使i减1,然后再使用i的值;
i+ + 使用完i的值以后,再让i的值加1;
i- - 使用完i的值以后,再让i的值减1。
4.关系运算符
C51语言中的关系运算符见表3-3-2。
说明:
① 前4种关系运算符(<、<=、>、>=)优先级相同,(= =、!=)后两种关系运算符的优先级相同,前4种的优先级高于后两种。
② 关系运算符的优先级低于算术运算符。
③ 关系运算符的优先级高于赋值运算符。
表3-3-2 C51语言中的关系运算符

用关系运算符将两个表达式连接起来的式子称为关系表达式。关系表达式的一般格式为:
表达式1 关系运算符 表达式2
关系表达式的值只有两种可能,即“真”和“假”。如果运算结果是“真”,用数值“1”表示;如果运算结果是“假”,则用数值“0”表示。
例如:a=2,b=3,c=1则
a>b的值为0;
a<c+b 的值为1;//先计算c+b,值为4,再比较a<4,结果为真,故值为1
a+c<b 的值为0;//先计算a+c,值为3,再比较3<b,结果为假,故值为0
5.位运算符
位运算符是用来进行二进制运算的运算符,包括逻辑位运算符和移位运算符,见表3-3-3。
表3-3-3 位运算符

位运算表达式一般格式为:
表达式1 位运算符 表达式2
位运算也有优先级,从高到低如图3-3-2所示。
![]()
图3-3-2 位运算符优先级
●&:按位与运算符。它实现“必须都有,否则都没有”的运算。其运算规则如下:
0&0=0 0&1=0 1&0=0 1&1=1
在实际应用中,按位“与”运算常用来对某些位清零或保留某些位。
例如:A的值为10100011,只想保留A的低四位,则用A&00001111。

●|:按位或运算符。它实现“只其中之一有,就有”的运算。其运算规则如下:
0|0=0 0|1=1 1|1=0 1|1=1
在实际应用中,按位“或”运算常用来将一个数值的某些位定值为“1”。
例如:A的值为11111100,想要把A最低位定值为“1”,则用A|00000001。

●~:按位取反运算符。它实现“是非颠倒”的运算。其运算规则如下:
~0=1 ~1=0
例如:A的值为11110000,按位取反~A=~11110000=00001111。
●^:按位异或运算符:它实现“两个不同就有,相同就没有”的运算。其运算规则如下:
0^0=0 0^1=1 1^1=0 1^1=0
在实际应用中,“异或”运算常用来使数值的特定位翻转。
例如:A的值为10010101,想将A的低四位翻转,即0变1,1变0,则用A^00001111。

●<<:左移运算符,见表3-3-4。它实现二进制的每一位都左移若干位的运算。其运算规则如下:高位移除,低位补0。
表3-3-4 左移运算

●>>:右移运算符,见表3-3-5。它实现二进制的每一位都右移若干位的运算。其运算规则如下:低位移除,高位补0。
表3-3-5 右移运算

6.逻辑运算符(https://www.daowen.com)
C51语言提供了3种逻辑运算符,见表3-3-6。
表3-3-6 逻辑运算

说明:C51语言编译系统在给出逻辑运算的结果时,用“1”表示“真”,而用“0”表示“假”,但是在判断一个量是否是“真”时,以“0”代表“假”,而以“1”代表“真”。
逻辑运算符的优先级如图3-3-3所示。
![]()
图3-3-3 逻辑运算符优先级
例如:若a=2,b=3,c=1。
a=!a;//因为a=2为真(1),所以!a为假(0),故a=0
b=a||b;//因为a、b均为真(1),所以a||b为真(1),故b=1
c=a&&b||c;//因为a、b、c均为真(1),所以a&&b为真(1),故c=1
7.复合赋值运算符
复合赋值运算符就是在赋值运算符“=”的前面加上其他运算符,见表3-3-7。
表3-3-7 复合赋值运算符

复合运算的一般格式为:
变量 复合赋值运算符 表达式
其含义就是变量与表达式先进行运算符所要求的运算,再把运算结果赋值给参与运算的变量。例如:
a+=3等价于a=a+3 x*=y+8等价于x=x(y+8)
二、程序
1.程序的构成
一个完整的C程序可由一个主函数和若干个子函数组成,由主函数调用子函数,子函数也可互相调用。同一个函数可以被一个或多个函数调用任意多次。C语言中的主函数为main()函数。例如:

分析程序的运行过程,主函数是程序运行的开始。程序从主函数的函数体第一行开始执行,直至while循环之前,这一部分在每次系统复位后会顺序执行一次,程序中变量的声明、系统初始化等可以放在这一部分运行。之后程序进入由while语句构成的主循环中,这一部分语句在程序运行时会无限循环执行。主函数的运行过程如图3-3-4所示。
2.程序的注释
为了提高程序的可读性,要在程序行的适当位置加入注释。注释形式一般有两种:
单行注释:直接在该行需要注释的地方加“//”。其格式为:

图3-3-4 主函数运行过程
//注释文字及符号
“//”后面的部分就被注释了,在程序编译时不起作用,但“//”前面的部分不受影响。
多行注释:在需要注释的段落开始位置加入“/*”,在结束位置加入“*/”。其格式为:
/*
注释文字
注释文字
......
*/
其中“/*”和“*/”起限定范围的作用,该范围内的语句都会被注释掉,将不再起作用。当然,多行注释也可以用来单行注释。
3.局部变量与全局变量
一个C语言程序中的变量可以被这个程序中的所有函数使用,也可以仅在一个函数中有效。这就是C语言中引入的局部变量和全局变量。
●局部变量:在一个函数内部定义的变量,它只在本函数范围内有效,即只有在本函数内才能使用此变量。例如:

说明:不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰,在内存中占不同的内存单元。
●全局变量:在函数之外定义的变量。全局变量可以在本文件中供所有的函数使用。它的有效范围从定义变量的位置到本源文件结束。例如:

三、循环语句
在实际应用中经常会遇到一个操作需反复执行的情况,而循环流程结构就能实现重复性操作控制,充分利用计算机运行速度快的特点高效完成大量重复的运算任务。循环结构分为当型循环和直到循环两类,构成循环结构的常用语句有while、do—while和for等。
1. while语句
while语句用来实现当型循环结构,其一般形式如下:

执行过程:当表达式的值为真(非0)时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。执行流程如图3-3-5所示。
2. do…while语句
do…while语句用来实现直到循环,特点是先执行循环体,然后判断循环条件是否成立。其一般形式如下:

while(表达式);
执行过程:执行do后面的语句,再判断表达式的值为真(非0)时,继续执行语句,否则退出。其特点是:先执行语句,后判断表达式。执行流程如图3-3-6所示。
对同一个问题,既可以用while语句处理,也可以用do…while语句处理,但是这两个语句是有区别的。

图3-3-5 while语句执行流程

图3-3-6 do…while语句执行流程
3. for语句
C语言中的for语句使用最为灵活,它不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定,只给出循环结束条件的情况。它既可以包含一个索引计数变量,也可以包含任何一种表达式。

for语句执行过程:
① 求解表达式1;
② 求解表达式2,若其值为“真”,则执行for语句中指定的循环语句,然后执行第③步;如果为“假”结束循环转到第⑤步;
③ 求解表达式3;
④ 转回上面的第②步执行;
⑤ 退出for循环,执行循环语句的下一条语句。
for语句执行过程的流程图如图3-3-7所示。
除了重复的循环指令体外,表达式模块由3个部分组成:
第1部分:表达式1是初始化表达式;
第2部分:表达式2是关系表达式;
第3部分:表达式3是增量或减量表达式。

图3-3-7 for语句执行流程