第三章 运算符及表达式.docx

上传人:b****5 文档编号:29627894 上传时间:2023-07-25 格式:DOCX 页数:10 大小:41.62KB
下载 相关 举报
第三章 运算符及表达式.docx_第1页
第1页 / 共10页
第三章 运算符及表达式.docx_第2页
第2页 / 共10页
第三章 运算符及表达式.docx_第3页
第3页 / 共10页
第三章 运算符及表达式.docx_第4页
第4页 / 共10页
第三章 运算符及表达式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

第三章 运算符及表达式.docx

《第三章 运算符及表达式.docx》由会员分享,可在线阅读,更多相关《第三章 运算符及表达式.docx(10页珍藏版)》请在冰豆网上搜索。

第三章 运算符及表达式.docx

第三章运算符及表达式

第三章运算符及表达式

说明:

Cx51的运算符与普通C语言的几乎完全一样,带复习性质,重点介绍在单片机中应用的特点。

一、运算符及表达式

运算符:

完成某种特定运算的符号。

运算符按其表达式中与运算符的关系可分为单目运算符,双目运算符和三目运算符。

单目就是指需要有一个运算对象,双目就要求有两个运算对象,三目则要三个运算对象。

运算对象:

在程序运行时,有数值或有数值传递给它。

表达式:

表达式则是由运算符及运算对象所组成的具有特定含义的式子。

C是一种表达式语言,表达式后面加";"号就构成了一个表达式语句。

例:

x=a*(b+c-a);

子表达式:

成对的括号以及在它们之间的全部符号组成的表达式。

上例中

(b+c-a)就是子表达式。

二、运算符

1、赋值运算符

1)赋值运算符

赋值符号“=”完成的操作即为赋值运算,它是右结合性,且优先级最低。

2)赋值表达式

将一个变量与表达式用赋值号连接起来就构成赋值表达式。

形式如下:

变量名=表达式

赋值表达式中的表达式包括变量、算术运算表达式、关系运算表达式、逻辑运算表达式等,甚至可以是另一个赋值表达式。

赋值过程是将“=”右边表达式的值赋给“=”左边的一个变量,赋值表达式的值就是被赋值变量的值。

例如:

a=(b=4)+(c=6);,该表达式的值为10,变量a的值为10。

3)赋值的类型转换规则

在赋值运算中,当“=”两侧的类型不一致时,要将数据转换成同一数据类型,转换的方式有两种,一种是系统自动转换,一种是强制转换。

(1)系统自动转换

编译时,将右边表达式的值转换成左侧变量的类型,再赋给该变量。

转换规则如下:

①实型数据赋给整型变量时,舍弃小数部分。

②整型数据赋给实型变量时,数值不变,但以IEEE浮点数形式存储在变量中。

③长字节整型数据赋给短字节整型变量时,实行截断处理。

如将long型数据赋给int型变量时,将long型数据的低两字节数据赋给int型变量,而将long型数据的高两字节的数据丢弃。

④短字节整型数据赋给长字节整型变量时,进行符号扩展。

如将int型数据赋给long型变量时,将int型数据赋给long型变量的低两字节,而将long型变量的高两字节的每一位都设为int型数据的符号值。

(2)强制转换

使用强制类型转换运算符转换:

(类型名)(表达式);

将表达式的数据类型转换为前面要求的类型名。

例1:

x=(float)a;

y=(int)(x+y);

例2:

unsignedcharx,y;

unsignedintz;

z=x+(unsignedint)y;

4)应用

在单片机中,经常要给寄存器、I/O口赋值:

(1)P1=0xff;//给P1口全置1

(2)P2=0x08;//给P2的第三位置1

(3)TF0=0;//清定时器T0的溢出标志位

(4)sbitP10=P1^0;//注意大写

bitx;

x=P10;

P10=!

P10;

2、算术运算符

c语言中的算术运算符有:

+加或取正值运算符

-减或取负值运算符

*乘运算符

/除运算符

%模(求余)运算符

上面这些运算符中加、减、乘、除为双目运算符,它们要求有两个运算对象。

这些大家已经很熟悉了。

3、关系运算符

c语言中有6种关系运算符:

>大于

<小于

>=大于等于

<=小于等于

==等于

!

=不等于

前4种关系运算符具有相同的优先级,后两种关系运算符也具有相同的优先级;但前4种的优先级高于后2种。

优先级别:

(低)赋值运算符→关系运算符→算术运算符(高)

4、逻辑运算符

逻辑运算符用来求某个条件式的逻辑值。

Cx51提供了3种逻辑运算符:

||逻辑或(AND)

&&逻辑与(OR)

!

逻辑非(NOT)

逻辑表达式:

用逻辑运算符将关系表达式或逻辑量连接起来。

逻辑表达式的一般形式为:

逻辑与:

条件式l&&条件式2

逻辑或:

条件式l||条件式2

逻辑非:

!

条件式

例如:

x&&y、a||b、!

z都是合法的逻辑表达式。

逻辑表达式的值是一个逻辑量真或假,0代表假,1代表真。

在逻辑运算中,把非0都看作逻辑1。

例:

a=4;b=0;

c=a||b;//c=1

c=a&&b;//c=0;

c=!

a;//c=0;

5、位运算符

1)能对运算对象进行按位操作,C语言中其有6种位运算符:

&按位与

|按位或

^按位异或

~按位取反

<<左移

>>右移

位运算符的作用是按位对变量进行运算,并不改变参与运算的变量值。

2)位运算符的优先级从高到低依次是:

按位取反(~)→左移(<<)和右移(>>)→按位与(&)→按位异或(^)→按位或(|)。

(注意次序,否则编程会犯错误)

3)所有位运算符的对象是int或char数据类型,不能为实数。

4)位运算的应用

例:

P1=P1&0xf8;//将P1口的P1.0、P1.1、P1.2清零,其他位不变

st=P0&0x07;//读P0.0、P0.1、P0.2的值,送入变量st

P1=P1|0x08;//将P1口的P1.3置1,其他位不变

P1=(P1&0xbf)|0x04;//给P1.6置低电平,P1.2置高电平,其

//他位不变

X=a^b//判断a是否与b相等,相等为0

5)位左移和位右移运算符(<<、>>)

位左移、位右移运算符“<<”和“>>”,用来将一个数的各二进制位的全部左移或右移1位;移位后,空白位补0,而溢出的位舍弃。

注意汇编语言的区别。

例:

若a=EAH=11101010B

则表达式:

a=a<<2,将a值左移两位,其结果为A8H。

汇编语言是循环移位,而C语言不是循环移位,但有循环移位的函数

unsignedchar_cror_(unsignedcharc,unsignedcharb);

上面是循环右移函数,c为待移动字符,b为移动位数。

循环左移函数是:

unsignedchar_crol_(unsignedcharc,unsignedcharb);

也可以自己编程循环移位。

下面讲右循环移位的例子。

例1:

若a=11000011B=0C3H,将a值右循环位移两位。

对a进行循环右移二位的程序如下:

#include

main()

{unsignedchara=0xc3,b,c,d;

chardatan=2;

b=a<<(8-n);//向左移6位,1、2位到7、8位

c=a>>n;//右移2位

d=c|b;//结果为11110000=0xf0,教材中方法

c=_cror_(a,2);//用库函数实现

}(调“循环移位”演示)

(注意,循环左、右移还是汇编方便)

例2:

LED动态显示时,位码要不断移动,现在用C语言编程实现。

位运算符

逻辑运算符

取反(非)

&

&&

|

||

P1=0x08;

P1=P1>>1;//每显示一位后移位一次

6)位运算与逻辑运算的比较

(1)符号比较

(2)位运算是对各位进行运算,逻辑运算的对象是逻辑变量。

例:

#include

Main()

{unsignedchara=136,b=34,x1,x2,x3,x4,x5,x6;//a=0x88,b=0x22

x1=!

a;//x1=0

x2=~a;//x2=0x77

x3=a||b;//x3=1

x4=a|b;//x4=0xaa

x5=a&b;//x5=0x00

x6=a&&b;//x6=1

}

(运行“逻辑运算”)

6、自增减运算符、复合运算符

1)自增减运算符

自增减运算符的作用是使变量值自动加1或减1。

如:

++i,--I“运算符在前,先运算后使用”即:

在使用i之前,先使i值加(减)1。

i++,i--“运算符在后,先使用后运算”即:

在使用i之后,再使i值加(减)1。

例:

若i值原来为5,则

j=++i;j值为6,i值也为6;

j=i++;j值为5,i值为6。

2)复合运算符及其表达式

凡是二目运算符,都可以与赋值运算符“=”一起组成复合赋值运算符。

Cx51共提供了10种复合赋值运算符,即

+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。

采用这种复合赋值运算的目的,是为了简化程序,提高C程序编译效率。

如:

a+=b相当于a=a+b

a%=b相当于a=a%b

a-=b相当于a=a-b

a<<=3相当于a=a<<3

a*=b相当于a=a*b

a>>=2相当于a=a>>2

a/=b相当于a=a/b

7、条件运算符

条件运算符,根据条件进行选择的运算符。

关系表达式1?

表达式2;表达式3;

表达式1的值为1,执行表达式2,否则执行表达式3。

例:

z=(a>b)?

a:

b;

相当于:

if(a>b)

z=a;

else

z=b;

8、应用例子

下面举一个使用位操作运算扫描识别键盘的例子。

1)工作原理

图示为8051单片机与一个4×4键盘接口的扫描电路。

(1)P1口的高四位作为行驱动线,轮流给高4位输出高电平,经非门变为低电平;通过非门可以提高驱动能力。

(2)读P1的低4位,如无键按下,P1的低4位应全为1;若有键按下,则不全为1。

(3)判断是否为同一次按键,将前次采集的值和本次采集的值相异或,同一次按键异或后为0,则不用新值替换旧值,若不一样,用新值替换旧值。

源程序如下:

#include

#defineucharunsignedchar

uchardataold;//全局变量,传递数据

key()

{

ucharcl,b;

for(cl=0x10;cl!

=0;cl=cl<<1)

{P1=0x0f|cl;//给高位轮流置1,给低位高电平,准备读端口

b=P1&0x0f;

if(b!

=0x0f)

{

if(b==0x0e||b==0x0d||b==0x0b||b==0x07)//判断低4//位是否全为1

{if(((P1&0x0f)^(old&0x0f))>0)//用异或判断按下的是否是新键

old=P1;//不同将新值存入旧值中

}}

}}

main()

{uchari;

old=0xff;//先给旧键值赋初值

for(i=1;i<10;i++)

key();

}

iteml:

在程序中使用了for循环,详细内容将在第四章讨论。

到发现变量cl变成O为止,这段程序将循环四次。

变量cl的初值为Oxl0,在向左移动四次后,有1的位将变为0,变量cl的所有位的值将全为0。

像汇编语言执行一个位移指令一样,一个<<指令逐次将所有移动的值填上0。

(调“键盘”)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1