1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Institute of Computer Software,Nanjing University,*,运算符和表达式,曹迎春,yccao,学习目标,熟练掌握,C+,各种运算符的使用方法。,能熟练运用运算符组成需要的表达式。,正确使用操作数的类型转换和运算符的优先级顺序和结合性。,2026/2/1 周日,2,重点和难点,自增、自减运算符的运用;,各个运算符的优先级顺序及其结合性;,操作数的类型转换。,2026/2/1 周日,3,知识点,算术运算符;自增、自减运算符;关系运算符;逻辑运算符;位运算符,;,赋
2、值运算符;求字节数运算符;,逗号表达式;短路表达式;,显式类型转换;隐式类型转换;,优先级与结合性,2026/2/1 周日,4,运算符,2026/2/1 周日,5,运算符,C+,语言中的运算符是可以让,C+,语言编译器能够识别的具有运算意义的符号。,运算符就是代表,C+,语言中的各个运算功能的名字,。,100+200-300*200+1000/20+100%10a|b&c|da=b+c+d*ea+=b+c-=d-,2026/2/1 周日,6,运算符的分类(按功能分),算术运算符,关系运算符,逻辑运算符,位运算符,条件运算符,赋值运算符,逗号运算符,sizeof,运算符,其它运算符,2026/2
3、/1 周日,7,运算符的分类(按操作数分),单目运算符(一个操作数),双目运算符(两个个操作数),三目运算符(三个操作数),2026/2/1 周日,8,算术运算符,运算符,名字,实例,+,加,12+4.9/,得出,16.9,-,减,3.98-4/,得出,-0.02,*,乘,2*3.4/,得出,6.8,/,除,9/2.0/,得出,4.5,%,取余,13%3/,得出,1,2026/2/1 周日,9,自增、自减运算符,+,是自增运算符,,-,是,自减运算符,这两个运算符都是单目运算符,且功能相近,都是将数值变量的值加,1,或减,1,,用户只能将这类操作符应用于变量而不能应用于常量。,+value,(
4、前缀式)、,value+,(后缀式),区别:,前缀式先将操作数增,1,(或减,1,),然后取操作数的新值参与表达式的运算。后缀是先将操作数增,1,(或减,1,)之前的值参与表达式的运算,到表达式的值被引用之后再做加,1,(或减,1,)运算。,2026/2/1 周日,10,自增、自减运算符,运算符,名字,实例,+,自加,(,前缀,),+valuel+10/,得出,16,,,valuel,变为,6,+,自加,(,后缀,),valuel+10/,得出,15,,,valuel,变为,6,-,自减,(,前缀,),-valuel+10/,得出,14,,,valuel,变为,4,-,自减,(,后缀,),va
5、luel-+10/,得出,15,,,valuel,变为,4,2026/2/1 周日,11,自增、自减运算符,例:,a=6;b=a+;,a=6;b=+a;,a=6;b=a-;,a=6;b=-a;,2026/2/1 周日,12,关系运算符,C+,提供,6,种关系运算符,用于数值之间的比较,表达式的值或为,1,(表示,true,),或为,0,(表示,false,),。,2026/2/1 周日,13,运算符,名字,实例,=,等于,5=5/,得出,1,!=,不等于,5!=5/,得出,0,小于,5 5.5/,得出,1,=,小于或等于,5,大于,5 5.5/,得出,0,=,大于或等于,6.3=5/,得出,1
6、关系运算符,注意:,关系运算符的操作数应当是一个数值,字符是有效的操作数,因为它们是用数值来表示的。,关系运算符两边的数值结果必须是类型相同的,否则会容易出现关系判断的错误。,字符串不应当用关系运算符比较,因为被比较的不是字符串的内容本身,而是字符串的地址。,2026/2/1 周日,14,逻辑运算符,运算符,名字,实例,!,逻辑非,!(5=5)/,得出,0,&,逻辑与,5 6&6 6/,得出,0,|,逻辑或,5 6|6 5/,得出,1,2026/2/1 周日,15,逻辑与(,&,)和逻辑或(,|,)运算,对于,0,和非,0,操作数而言,非,0,表示逻辑真(,true,),,0,表示逻辑假(,
7、false,)。,在逻辑运算中,并不是所有的逻辑运算符都被执行,只有在必须执行下一个运算符后才能得出表达式的值时,才执行该运算符。,2026/2/1 周日,16,运算符,操作数,1,操作数,2,表达式的值,逻辑与(,&,),true,true,true,false,true,false,true,false,false,false,false,false,逻辑或(,|,),true,true,true,false,true,true,true,false,true,false,false,false,逻辑运算符,在有些,C+,环境中,没有专门的布尔类型,bool,,而用整数型,int,来代替。
8、int IsEmpty=0/,代表假,int IsEmpty=1/,代表真。,一般只有,0,代表假,而其它的任何值都代表真。,20&112|00|2001,逻辑表达式中的逻辑运算不是都需要执行的,。,1|(100/0)0&(100/0),2026/2/1 周日,17,逻辑表达式,例:,!20/,得出,010&5/,得出,110|5.5/,得出,110&0/,得出,0,2026/2/1 周日,18,位运算符,位操作运算符是用来进行二进制位运算的运算符。,逻辑位运算符,移位运算符。,2026/2/1 周日,19,运算符,名字,实例,取反,011/,得出,366,&,逐位与,011&027/,得出
9、001,|,逐位或,011|027/,得出,037,逐位异或,011 027/,得出,036,逐位左移,011,逐位右移,011 2/,得出,002,逻辑位运算符,单目逻辑位运算符:,(按位求反),作用是将各个二进制位由,1,变,0,,由,0,变,1,。,双目逻辑运算符:,&,(按位与),,|,(按位或),,(按位异或),其中优先级,&,高于,,而,高于,|,。,&,:两个都为,1,时结果为,1,。,|,:两个其中有一个为,1,则结果为,1,。,:两个不同则结果为,1,,否则为,0,。,2026/2/1 周日,20,移位运算符,(右移),例:,指出下面表达式的功能。,(p&0377)|(k&
10、0 xff)8,2026/2/1 周日,21,位运算符,例:,对两个操作数,011,和,027,,给出各个位运算符的计算实例,。,2026/2/1 周日,22,赋值运算符,=,是赋值运算符,,表示,将一个表达式的值赋给一个左值。,所谓左值是指一个能用于赋值运算左边的表达式。左值必须能够被修改,不能是常量。,int a,b,c;a=3;b=4;c=(a+b)*,(,2*a-b,),2026/2/1 周日,23,复合,赋值运算符,运算符,实例,等价于,=,n=25,+=,n+=25,n=n+25,-=,n-=25,n=n-25,*=,n*=25,n=n*25,/=,n/=25,n=n/25,%=,
11、n%=25,n=n%25,&=,n&=0 xF2F2,n=n&0 xF2F2,|=,n|=0 xF2F2,n=n|0 xF2F2,=,n=0 xF2F2,n=n 0 xF2F2,=,n=4,n=n =,n=4,n=n 4,2026/2/1 周日,24,多重赋值表达式,当右操作数又是一个赋值表达式时,形成多重赋值表达式。例如:,i=j=0;/,结果,i,、,j,的值都为,0,多重赋值表达式不能出现在变量说明中。例如:,int i=j=0;/,非法,例:有变量说明,int a=2,b;,指出下面表达式运算后,a,和,b,的结果。,b+=b=+a;,2026/2/1 周日,25,多重赋值表达式,例:
12、int m,n,p;m=n=p=100;m=(n=p=100)+2;m+=n=p=10;,2026/2/1 周日,26,嵌入赋值,将赋值运算与比较运算结合在一起形成嵌入赋值。例如:,while(ch=getchar()!=n);,2026/2/1 周日,27,求字节数运算符,sizeof,是一个单目运算符,用于计算表达式或数据类型的字节数,其运算结果与不同的编译器和机器相关。,2026/2/1 周日,28,程序举例,#include int main(void),cout char size=sizeof(char)bytesn;,cout char*size=sizeof(char*)by
13、tesn;,cout short size=sizeof(short)bytesn;,cout int size=sizeof(int)bytesn;,cout long size=sizeof(long)bytesn;,cout float size=sizeof(float)bytesn;,cout double size=sizeof(double)bytesn;,cout 1.55 size=sizeof(1.55)bytesn;,cout 1.55L size=sizeof(1.55L)bytesn;,cout HELLO size=sizeof(HELLO)bytesn;,2026
14、/2/1 周日,29,运行结果,char size=1 byteschar*size=2 bytesshort size=2 bytesint size=2 byteslong size=4 bytesfloat size=4 bytesdouble size=8 bytes1.55 size=8 bytes1.55L size=10 bytesHELLO size=6 bytes,2026/2/1 周日,30,常用数据类型的字节数,数据类型,占用字节数,Char,1,Char*,4,Short,2,Int,4,Long,4,Float,4,Double,8,2026/2/1 周日,31,条件
15、运算符,格式:,操作数,1,?,操作数,2,:,操作数,3,cout(A=ch&ch=Z)?(a+ch-A),:,ch,int m=1,n=2;int min=(m n?m:n);,int m=1,n=2,p=3;int min=(m n?(m p?m:p):(n=b?)(b=c?b:c):(a=c?a:c),2026/2/1 周日,32,逗号运算符,逗号运算符带两个操作数,返回值是右操作数。,逗号表达式的一般形式如下:,表达式,1,,表达式,2,,,,表达式,n,例:,int m,n,min;int mCount=0,nCount=0;/.min=(m,(CWnd*wnd)-FromHand
16、le,结构或类中的域变量,.,(CWnd wnd).FromHandle,数组下标运算符,nYearsMonthsDays1012366,内存分配运算符,new,new CWnd,内存释放运算符,delete,delete(CWnd*wnd),2026/2/1 周日,34,优先级和结合性,2026/2/1 周日,35,C+,运算符的优先级和结合性,2026/2/1 周日,36,优先级和结合性举例,a=b+c*d,a=b+=c,c=a+b*a b,不同类型的运算符混合使用时,即使实现优先级与实际需要相符,最好也使用括号隔离之,以便代码更加清晰。,2026/2/1 周日,37,类型转换,2026/
17、2/1 周日,38,C+,数据类型的转换,条件,转换,较高级别操作数的类型为,long double,另一个操作数被转换为,long double,较高级别操作数的类型为,double,另一个操作数被转换为,double,较高级别操作数的类型为,float,另一个操作数被转换为,float,较高级别操作数的类型为,unsigned long,另一个操作数被转换为,unsigned long,较高级别操作数的类型为,long,另一个操作数被转换为,long,较高级别操作数的类型为,unsigned int,另一个操作数被转换为,unsigned int,两个操作数为,char,unsigned
18、char,signed char,,,short,unsigned short,类型,均转换为,int,2026/2/1 周日,39,自动类型转换,char ch=c,;,int a,,,b=13,;,float x=2.0,;,double y,;,a=ch+5,;,x=b/2/x,;,x=b/x/2;y=x/b,;,double d=1;int i=10.5;i=i+d;,2026/2/1 周日,40,强制类型转换,举例:,(int)3.14/3.14,转换成整型数,3(long)3.14/3.14,转换成长整型数,3L(double)2/2,转换成双精度数,2.0(char)122/12
19、2,转换成,Unicode,码为,122,的字符,(unsigned short)3.14/3.14,转换成无符号整型数,3,2026/2/1 周日,41,强制类型转换,类型标识符能被用于类型运算符。类型运算符是单目运算符,并位于其操作数的左边的圆括号里,称之显式类型转换,或强制类型转换。显式类型转换的一般形式为:,(类型名)(表达式),2026/2/1 周日,42,强制类型转换,例子,转换前类型,转换后类型,结果,(int)3.5,双精度浮点型,double,整型,int,3,(long)-3.5,双精度浮点型,double,长整型,long,-4,(double)2,整型,int,双精度浮
20、点型,double,2.0,(char)122,整型,int,字符型,char,0 x7A,(float)2,整型,int,单精度浮点型,float,2.0F,(unsigned short)3.5,双精度浮点型,double,无符号短整型,unsigned short,3,int,(,3.5,),双精度浮点型,double,整型,int,3,2026/2/1 周日,43,混合运算中的,隐式类型转换,举例:,double d=2;int i=3.5;i=i-d;,2026/2/1 周日,44,类型转换举例,short ishort=1000;unsigned char uichar;uicha
21、r=ishort;ishort=uichar;,2026/2/1 周日,45,表达式,2026/2/1 周日,46,表达式的种类,算术表达式,关系表达式,逻辑表达式,条件表达式,赋值表达式,逗号表达式,2026/2/1 周日,47,表达式,注意:,在表达式中,连续出现两个运算符时,最好用空格符分隔。如:,a+b;(a+b?a+b?),在写表达式中,有时记不清楚运算符的优先级时,可使用括号来确定运算符组合。,2026/2/1 周日,48,表达式的值和类型,在计算一个表达式的值时,应注意下述两点:,先确定运算符的功能。,确定计算顺序。,表达式的类型由运算符的种类和操作符的类型决定。,2026/2/
22、1 周日,49,算术表达式,算术表达式是由算术运算符和位操作运算符组成的表达式,其表达式的值是一个数值。表达式的类型具体地由运算符,和,操作数决定。,#include void main(),int a,b,m=3,n=4;,a=7*2+-3%5-4/3;/-3%5=-3,,,4/3=1,b=m+-n;,coutatbtmtnendl;,2026/2/1 周日,50,10 0 4 3,关系表达式,由关系运算符组成的表达式为关系表达式。关系表达式的运算结果为逻辑型,常用在条件语句和循环语句中。,#include void main(),char x=m,y=n;,int n;,n=xy;,cou
23、t nendl;,n=x=y-1;,coutnendl;,n=(y!=Y)+(53)+(y-x=1);,cout nb?+a:+b;,couta,b,cendl;,c=a-b?a-3?b:b-a:a;,couta,b,cendl;,2026/2/1 周日,53,3 5 5,3 5 2,赋值表达式,由赋值运算符组成的表达式为赋值表达式。,例:,int a,b,c,d;a=b=c=d=5/2;,int a=3,,,b=4,;,a*=b+1,;,x=func();if(x=3),.,2026/2/1 周日,54,if(x=func()=3).,逗号表达式,逗号表达式是用逗号将若干个表达式连起来组成的表达式。该表达式的值是组成逗号表达式的若干个表达式中的最后一个表达式的值,类型也是最后一个表达式的类型。,#include void main(),int a,b,c;,a=1,b=2,c=a+b+3;,couta,b,cendl;,c=(a+,a+=b,a-b);,couta,b,cendl;,2026/2/1 周日,55,1,2,6,4,2,2,2026/2/1 周日,56,Thank you!,






