理解运算符的优先级_第1页
理解运算符的优先级_第2页
理解运算符的优先级_第3页
理解运算符的优先级_第4页
理解运算符的优先级_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章运算符与表达式3.1运算符概述3.2算术运算符与算术表达式

3.3赋值运算符与赋值表达式3.4关系运算与逻辑运算

3.5逗号运算符与逗号表达式3.6位运算符3.7指针变量的运算3.8表达式中的类型转换3.1运算符概述3.1.1C语言运算符分类

C语言中运算符和表达式数量之多,在高级语言中是少见的,正是丰富的运算符和表达式使C语言功能十分完善。这也是C语言的主要特点之一。运算符的种类

C语言的运算符共有10类见教材Pg.47表3-1表3-1C语言的运算符学习运算符应注意的几个问题

(1)运算符的功能;(2)与运算量的关系

a.求运算量的个数

单目运算++,--,&,-双目运算+,-,*,%三目运算?:(3)运算符的优先级别(4)运算符的结合性(也称结合方向)(5)运算结果的类型b.求运算量的类型3.1运算符概述2+3*4-61/21.0/2

C语言的运算符不仅具有不同的优先级(共分为15级。1级最高,15级最低),而且还有一个特点,就是它的结合性。结合性指优先级相同时,运算的左右顺序。

因此,在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。例:a*b/c左右

++,--,&右左3.1.2优先级与结合性3.1运算符概述3.2.1

算术运算符3.2算术运算符与算术表达式设i=5说明:

1)当“/”被用于整数或字符时,结果取整。例如,在整数除法中,5/2结果为2,1/2的结果为0。

2)取负运算的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。

3)求余(或求模运算符)“%”,取整数除法的余数,其结果等于两数相除后的余数。要求参与运算的数据必须是整型数据,(“%”不能用于float和double类型)余数的符号始终与分子的符号一致。例如,9%4=;-9%4=;9%-4=;-9%-4=。3.2算术运算符与算术表达式1-1-11++,--运算符为单目运算,要求运算对象只能是变量结合方向:为由右至左。优先级:高于双目运算可有以下几种形式:

++i变量i自增1后再参与其它运算。

i++

变量i参与运算后,i的值再自增1。

--i变量i自减1后再参与其它运算。

i--变量i参与运算后,i的值再自减1。4)自增,自减运算符自增运算符:++其功能是使变量的值自增1。自减运算符:--其功能是使变量值自减1。3.2算术运算符与算术表达式10++++(i+j)×例3-2:main(){intx,y;x=10;y=++x;printf(“%d,%d”,x,y);}程序运行后,输出结是:如果将程序的第2行改为:x=10;y=x++

;结果如何?因此,关键在于区别变量是先参与运算,还是先使用变量自增(自减)

13.2算术运算符与算术表达式11,11例#include<stdio.h>voidmain(){inta1,a2,a3,a4,b1,b2,b3,b4;a1=a2=a3=a4=10;b1=(a1++)+(a1++);b2=(++a2)+(++a2);b3=(a3--)+(a3--);b4=(--a4)+(--a4);printf("a1=%d,a2=%d,b1=%d,b2=%d\n",a1,a2,b1,b2);printf("a3=%d,a4=%d,b3=%d,b4=%d\n",a3,a4,b3,b4);}程序运行后,输出结是:3.2算术运算符与算术表达式a1=12,a2=12,b1=20,b2=24a3=8,a4=8,b3=20,b4=163.2.2算术表达式定义:由算术运算符、括弧、内部函数及数据组成的式子例如,下面数学表达式对应的C语言表达式。(b-sqrt(b*b-4*a*c))/(2*a)(a+b)/(a-b)(2*3.14159*r+exp(-5))*log(x)3.2算术运算符与算术表达式表达式的书写原则:(1)表达式中的所有运算符和操作数必须并排书写。不能出现上下标(如x2,x2等)和数学中的分数线。(2)在C表达式中不能省略乘号(如2ab、xy等)。(3)要注意各种运算符的优先级别,为保持运算顺序,在写C表达式时需要适当添加括号()。(4)若要用到库函数,必须按库函数要求书写,如上面表达式中的sqrt、exp、log就是库函数。库函数的书写格式是:库函数名(参数表)。(5)表达式中不能出现C语言字符集以外的字符,如β、α、δ、π等希腊字母及≤、≥、÷、≠等数学运算符号。

3.2算术运算符与算术表达式3.3赋值运算符和赋值表达式3.3.1简单赋值运算符与表达式

其一般形式为:变量=表达式

功能:计算表达式的值再赋予左边的变量。整个赋值表达式的值为:左边变量的值

例如:x=a+b;w=0.5*a*t*t;/*如果写成:1/2*a*t*t,则结果为0*/y=i++;x=a+b

w=sin(a)+sin(b)赋值运算符的结合方向:由右至左因此a=b=c=5可理解为:a=(b=(c=5))

优先级:低于条件运算符?:,高于逗号运算符

,在赋值表达式的未尾加上分号,就构成为赋值语句

3.3赋值运算符和赋值表达式关于赋值运算的说明:如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体转换规定如下:1)实型赋予整型,舍去小数部分。2)整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。3)字符型赋予整型,由于字符型为一个字节,整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。4)整型赋予字符型,只把低八位赋予字符量。3.3赋值运算符和赋值表达式

例3-4用程序验证不同类型变量的赋值的类型转换。voidmain(){inta,b,c=322;floatx,y=3.14;charch1='a',ch2;a=y;x=c;b=ch1;ch2=c;printf(“a=%d,x=%f,b=%d,ch2=%c",a,x,b,ch2);}程序运行结果是:

a=3,x=322.000000,b=97,ch2=B3.3赋值运算符和赋值表达式c=322的二进制表示为:000000010100001066

在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如:+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=构成复合赋值表达式的一般形式为:

变量双目运算符=表达式它等效于:

变量=变量运算符表达式

优先级别:仅高于逗号(,)运算符例如:

a+=5

等价于a=a+5

x*=y+7

等价于x=x*(y+7)

r%=p

等价于r=r%p

复合赋值符的优先级和结合方向与赋值运算符(=)相同3.3.2复合赋值运算符与表达式3.3赋值运算符和赋值表达式#include<stdio.h>voidmain(){inta=10,b=10;printf("%d\t",a+=a-=a*a);printf("%d\n",b+=b-=b*=b);}输出:-1800

3.4.1关系运算符与关系表达式关系运算符及优先级别比较两个量的运算符称为关系运算符。在C语言中有以下关系运算符。(见教材P53.表3-3)

<,<=,>,>=,==

,!=

关系运算符的优先级:

(1)

>、>=、<、<=优先级相等,==、!=优先级相等,前者高于后者。

(2)算术运算符>

关系运算符>

赋值运算符

3.4关系运算与逻辑运算关系表达式

关系表达式的一般形式为:

表达式关系运算符表达式

关系表达式的值是:关系成立为“真”,不成立则为“假”

C语言中用“1”

表示“真”

“0”

表示“假”例如:a+b>c-dx>3/2

‘a’+1<c-i-5*j==k+1都是合法的关系表达式。3.4关系运算与逻辑运算由于表达式中也可以包含关系表达式。因此出现嵌套的情况,例如:当a=5,b=4,c=3时

a<(b>c) a!=(c==b)

又如:

(a=3)>(b=5)由于3>5不成立,故其值为0。又如:当a=5,b=4时

a+=3<b------------假(0)------------真(1)------------假(0)------------63.4关系运算与逻辑运算

数学中:a在2到100之间时,C语言能不能用2<a<100表示?3.4.2逻辑运算符与逻辑表达式

1、逻辑运算符C语言中提供了三种逻辑运算符

!

非运算&&

与运算||

或运算运算符&&和运算符||均为双目运算符,具有左结合性。非运算符!为单目运算符,具有右结合性

(1)逻辑运算符优先级表示如下:

!>&&>||

而且:&&,||低于关系运算符!高于算术运算符

!(非)(高)算术运算符关系运算符&&和||赋值运算符(低)3.4关系运算与逻辑运算

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

逻辑运算符

表达式

按照运算符的优先顺序可以得出:

a>b&&c>d(a>b)&&(c>d)

!b==c||d<a((!b)==c)||(d<a)a+b>c&&x+y<b((a+b)>c)&&((x+y)<b)

逻辑表达式的值:逻辑表达式的值也为“真”和“假”两种,用“1”和“0”来表示。3.4关系运算与逻辑运算

例判断某一年份year是否是闰年,如何用C语言描述。3.4关系运算与逻辑运算(year%4==0&&year%100!=0)||(year%400==0)解析:year是闰年,需满足以下条件之一:该年可以被4整除,但不能被100整除。该年可以被400整除。则可以用逻辑表达式表示为:

表达式a&&b&&c

的求解过程

只有a为真时,才判别b的值;只有a和b均为真时,才判别c的值。只要a为假,就不再判别b和c的值,直接求得表达式的值为假。3、关于逻辑运算的说明图3-1表达式a&&b&&c的求解过程

3.4关系运算与逻辑运算

表达式

a||b||c

的求解过程只要a为真,就不再判别b和c的值,直接求得表达式的值为真。只有a为假时,才判别b的值;只有a和b均为假时,才判别c的值3.4关系运算与逻辑运算图3-2表达式a||b||c的求解过程

设a,b,c,d均为0,执行(m=a==b)&&(n=c!=d)后m,n的值分别是m=1,n=03.4关系运算与逻辑运算当c的值为0时,在下列选项中能将c的值赋给变量a,b的是DA.c=a=bB.(a=c)&&(b=c)C.a=c=bD.(a=c)||(b=c)

例3-5

分析下面程序的运行结果。Voidmain(){intx=5,y=9,k=1,a;a=x++||y++&&k++;printf("a=%d,x=%d,y=%d,k=%d\n",a,x,y,k);}3.4关系运算与逻辑运算程序运行结果如下:3.4关系运算与逻辑运算分析:语句“a=x++||y++&&k++;”的执行过程是先求“=”右边的值,即计算表达式“x++||y++&&k++”的值,系统从左到右进行扫描,x=5,x++是先取x的值(即5,运算后x的值增加1)进行“||”运行,因为不管其右边的值是什么,其结果都是成立的,即整个表达式的值为1,C系统就不再计算“||”右边表达式“y++&&k++”,所以y的值,k的值不变。

读者思考:

如果x的初值为0,程序的运行结果如何?

3.5逗号运算符和逗号表达式

在C语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。其一般形式为:

表达式1,表达式2,…,表达式n

其求值过程是分别求表达式1、表达式2…表达式n的值,并以最后一个表达式n的值作为整个逗号表达式的值。

求解逗号表达式“x=a=3,6*a”后,表达式的值、x、a的值以此是表达式的值=18x=3a=3

例题

voidmain(){inta=2,b=4,c=6,x,y;y=((x=a+b++),(b+c),x+c);printf("y=%d,x=%d",y,x);}结果是:?有关逗号表达式的说明:

1)逗号运算符优先级最低。

2)程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。

3)并不是在所有出现逗号的地方都组成逗号表达式,如在变量声明中或函数参数表中的逗号只是用作各变量之间的间隔符。3.5逗号运算符和逗号表达式y=12,x=6

前面介绍的各种运算都是以字节作为最基本位进行的。但在很多系统程序中常要求在位(bit)一级进行运算或处理。

C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。3.6位运算符

所谓位运算是指,按二进制位进行的运算

C语言提供了6种位运算符,它们的运算规则如教材P57表3-5所示

表3-6位运算符的运算规则

1.按位与──&

(1)格式:x&y

(2)规则:对应位均为1时才为1,否则为0:9&5=1。例如,9&5可写算式如下:

00001001(9的二进制补码)&00000101(5的二进制补码)

00000001(1的二进制补码) 主要用途:

1)清零。方法是与一个各位都为零的数值按位与,结果为零。

2)取一个数x中某些指定位。方法是找一个数,此数的各位是这样取值的:对应x数要取各位,该数对应位为1,其余位为零。

3.6位运算符

2.按位或──|

(1)格式:x|y

(2)规则:对应位均为0时才为0,否则为1:3|9=11。例如,9|5可写算式如下:

00001001|0000010100001101(十进制为13)即9|5=13按位或的特殊用途:常用来对一个数据的某些位置13.6位运算符

3.按位异或──^(1)格式:x^y(2)规则:对应位相同时为0,不同时为1:9^5=12(3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变4.按位取反──~(1)格式:~x(2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1:在IBM-PC机中,~0=0xffff,~9=0xfff6(3)主要用途:间接地构造一个数,以增强程序的可移植性3.6位运算符

例:若a整型变量,表达式“~(a^~a)”等于表达式~3(2&3^4)的值为04

5.按位左移──<<(1)格式:x<<位数(2)规则:使操作数的各位左移,低位补0,高位溢出:例P3026.按位右移──>>(1)格式:x>>位数(2)规则:使操作数的各位右移,移出的低位舍弃;高位:1)对无符号数和有符号中的正数,补0;2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。例如,20>>2=5。说明:(1)x、y和“位数”等操作数,都只能是整型或字符型数据。除按位取反为单目运算符外,其余均为双目运算符。(2)参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。例如,5<<2=20:0101→10100,20>>2=5:10100→00101。3.6位运算符

7.位运算符与赋值运算符组成复合运算符除按位取反运算符(~)外,其他位运算符都可与赋值运算符组成复合位赋值运算符。它们是:&=,|=,>>=,<<=,∧=。例如,a&=b等价于a=a&b,a|=b等价于a=a|b,a>>=b等价于a=a>>b。

voidmain(){unsigneda,b,x,y;printf("Enteranumber=?\n");scanf("%o",&a);/*输入1个八进制整数给a*/b=a>>4; /*将a右移4位

*/x=~(~0<<4);/*间接构造1个低4位为1、其余各位为0的整数*/y=b&x;printf("%o\n%o\n",a,y); /*按八进制数输出a和y*/}3.6位运算符

例3-7编写程序取一个整数a从右端开始的第4~7位(最右边是第0位)。例如:0000000101000010,取右端第4~7位为:0100.3.7指针变量的运算1.取地址运算符&

其格式是:&变量名例如:p=&a;&是单目运算符,其结合性为自右至左。2.取内容运算符*其格式是:*指针变量名例如:*p=5;/*给指针变量p指向的变量赋值5*/printf("%d",*p);/*打印输出指针变量指向的变量的值*/*是单目运算符,其结合性为自右至左。注意:指针运算符“*”和指针变量说明中的指针说明符“*”不同。例如:inta=3,x,*p;/*a,x为整型,*p的基准类型为整型*/…p=&a;/*指针变量p取得了整型变量a的地址*/x=*p;/*将指针变量p所指向的变量a的值赋给变量x*/3.7.1指针运算符2.&*p与*&a(1)&*p等价于&(*p)和&a,即变量a的地址,也就是p。注意不要写成:&*a×(2)*&a等价于*(&a)和*p,即变量a。由此可见,&和*是一对互逆的运算符。1.p++与++p假设变量a的地址为2000,p=&a;则:(1)p++表达式的值为2000,而p的值变为2002,因为p指向一块大小为2字节的存储空间,p+1将指向相邻的下一块大小为2字节的存储空间。(2)++p表达式的值为2002,p的值也变为2002。同理可知,p--表达式的值为2000,而p的值变为1998;--p表达式的值为1998,p的值也变为1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论