计算机软件技术基础 第7章 运算符和表达式.ppt
第七章第七章 运算符和表达式运算符和表达式7.1 运算符运算符n算术运算符:、*、/、%n关系运算符:、=、=、!=n逻辑运算符:!、&、|n位运算符:、|、&n赋值运算符:=及其扩展赋值运算符n条件运算符:?:n逗号运算符:,n指针运算符:*、&n求字节数运算符:sizeofn强制类型转换运算符:(类型)n分量运算符:.、n下标运算符:n自加、自减运算符:、n其它:如函数调用运算符()第七章第七章 运算符和表达式运算符和表达式7.2表达式表达式n由运算符加上运算对象就构成了表达式,由运算符加上运算对象就构成了表达式,C语语言允许使用以下类型的表达式:言允许使用以下类型的表达式:(1)赋值表达式,如:)赋值表达式,如:a=5(2)算术表达式,如:)算术表达式,如:34*2(3)关系表达式,如:)关系表达式,如:56(4)逻辑表达式,如:)逻辑表达式,如:35&a=b(5)条件表达式,如:)条件表达式,如:ab?a:b(6)逗号表达式,如:)逗号表达式,如:a=3,b=4,c=5第七章第七章 运算符和表达式运算符和表达式7.3 表达式的求值规则表达式的求值规则nC语言中的任何一个表达式都有一个确语言中的任何一个表达式都有一个确定的值,表达式的求值规则如下:定的值,表达式的求值规则如下:(1)按运算符的优先级高低次序执行。)按运算符的优先级高低次序执行。(2)如果在一个运算对象(或称操作数)如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按两侧的运算符的优先级相同,则按C语言语言规定的结合方向(结合性)进行。规定的结合方向(结合性)进行。第七章第七章 运算符和表达式运算符和表达式n优先级,是指在表达式中,运算符优先优先级,是指在表达式中,运算符优先级较高的先于优先级较低的进行运算。级较高的先于优先级较低的进行运算。n结合性,是指当一个操作数两侧的运算结合性,是指当一个操作数两侧的运算符具有相同的优先级时,该操作数是先符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的与左边的运算符结合,还是先与右边的运算符结合。自左至右的结合方向,称运算符结合。自左至右的结合方向,称为左结合性,反之称为右结合性。为左结合性,反之称为右结合性。n单目运算符、条件运算符和赋值运算符单目运算符、条件运算符和赋值运算符是右结合性,其他运算符是左结合。是右结合性,其他运算符是左结合。7.3 表达式的求值规则表达式的求值规则第七章第七章 运算符和表达式运算符和表达式n算术表达式中,运算对象可以是常量,算术表达式中,运算对象可以是常量,变量和函数等。变量和函数等。1基本算术运算符基本算术运算符基本算术运算符有如下基本算术运算符有如下5种:种:(加法加法)、(减法减法)、*(乘法乘法)、/(除法除法)、%(求余数求余数)7.4 算术表达式算术表达式第七章第七章 运算符和表达式运算符和表达式n说明:说明:(1)除法运算)除法运算“/”:C语言规定:两个整数相语言规定:两个整数相除,其商为整数,小数部分被舍弃。如果相除除,其商为整数,小数部分被舍弃。如果相除的两个数中至少有一个是实型的,则结果为实的两个数中至少有一个是实型的,则结果为实型。型。(2)求余数运算)求余数运算“%”:求余数运算要求两侧的:求余数运算要求两侧的操作数均为整型数据,否则出错。在操作数均为整型数据,否则出错。在Turbo C中,结果的符号与被除数的符号相同。中,结果的符号与被除数的符号相同。7.4 算术表达式算术表达式第七章第七章 运算符和表达式运算符和表达式2算术表达式算术表达式n所谓算术表达式,是指表达式中的运算符都是所谓算术表达式,是指表达式中的运算符都是算术运算符。算术运算符。n在在C语言中,整型、实型和字符型数据间可以语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用)混合运算(因为字符数据与整型数据可以通用),如果一个运算符两侧的操作数的数据类型不,如果一个运算符两侧的操作数的数据类型不同,则系统按同,则系统按“先转换,后运算先转换,后运算”的原则,首的原则,首先将数据自动转换成同一类型,然后在同一类先将数据自动转换成同一类型,然后在同一类型数据间进行运算。型数据间进行运算。7.4 算术表达式算术表达式第七章第七章 运算符和表达式运算符和表达式7.4 算术表达式算术表达式说明:说明:(1)横向向左的箭头,表示必须的转换。)横向向左的箭头,表示必须的转换。(2)纵向向上的箭头,表示不同类型的转换)纵向向上的箭头,表示不同类型的转换方向。方向。第七章第七章 运算符和表达式运算符和表达式n注意:注意:箭头方向只表示数据类型级别的高低,箭头方向只表示数据类型级别的高低,由低向高转换,不要理解为由低向高转换,不要理解为int型先转成型先转成unsigned型,再转成型,再转成long型,再转成型,再转成double型。如果一个型。如果一个int型数据与一个型数据与一个double型数据运算,是直接将型数据运算,是直接将int型转成型转成double型。型。7.4 算术表达式算术表达式第七章第七章 运算符和表达式运算符和表达式7.5 赋值表达式赋值表达式1赋值运算符:赋值运算符:=作用是将一个表达式的值赋给一个变量。作用是将一个表达式的值赋给一个变量。2赋值表达式赋值表达式n由赋值运算符将一个变量和一个表达式连接由赋值运算符将一个变量和一个表达式连接起来就构成了赋值表达式,它的一般形式为:起来就构成了赋值表达式,它的一般形式为:变量变量=表达式表达式n对赋值表达式求解的过程是:先求解赋值运算对赋值表达式求解的过程是:先求解赋值运算符右侧表达式的值,然后将值赋给左边的变量,符右侧表达式的值,然后将值赋给左边的变量,赋值表达式的值就是被赋值的变量的值。赋值表达式的值就是被赋值的变量的值。第七章第七章 运算符和表达式运算符和表达式n例如:例如:x=5 /*将将5赋值给变量赋值给变量x*/y=(float)5/2 /*将表达式的值将表达式的值(=2.5)赋值给赋值给变量变量y*/n注意:被赋值的变量,必须是单个变量,且必注意:被赋值的变量,必须是单个变量,且必须在赋值运算符的左边;赋值表达式又允许出须在赋值运算符的左边;赋值表达式又允许出现在其它赋值表达式当中。现在其它赋值表达式当中。7.5 赋值表达式赋值表达式第七章第七章 运算符和表达式运算符和表达式n当表达式值的类型与被赋值变量的类型不一当表达式值的类型与被赋值变量的类型不一致,但都是数值型或字符型时,系统会自动地致,但都是数值型或字符型时,系统会自动地将表达式的值转换成被赋值变量的数据类型,将表达式的值转换成被赋值变量的数据类型,然后再赋值给变量。具体规定如下:然后再赋值给变量。具体规定如下:(1)实型赋予整型,舍去小数部分。)实型赋予整型,舍去小数部分。(2)整型赋予实型,数值不变,但将以浮点)整型赋予实型,数值不变,但将以浮点形式存放。形式存放。(3)字符型赋予整型,由于字符型为一个字)字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的节,而整型为二个字节,故将字符的ASCII码码值放到整型量的低八位中,高八位为值放到整型量的低八位中,高八位为0。短整。短整型赋给长整型时同理。型赋给长整型时同理。第七章第七章 运算符和表达式运算符和表达式(4)整型赋予字符型,只把低八位赋予字符)整型赋予字符型,只把低八位赋予字符量。长整型赋给短整型时同理。量。长整型赋给短整型时同理。(5)双精度实型数据转换成单精度实型数据)双精度实型数据转换成单精度实型数据时,只保留单精度的有效位数。时,只保留单精度的有效位数。(6)除自动转换外,)除自动转换外,C语言也允许强制转换。语言也允许强制转换。数据类型强制转换的一般格式为数据类型强制转换的一般格式为(要转换成的数据类型要转换成的数据类型)(被转换的表达式被转换的表达式)其中,当被转换的表达式是一个简单表达式其中,当被转换的表达式是一个简单表达式时,外面的一对原括号可以省略。时,外面的一对原括号可以省略。7.5 赋值表达式赋值表达式第七章第七章 运算符和表达式运算符和表达式n例如:例如:(double)a /*将变量将变量a的值转换成的值转换成double型,等价于型,等价于(double)(a)*/(int)(xy)/*将将xy的结果转换成的结果转换成int型型*/(float)5/2 /*将将5转换成实型,再除以转换成实型,再除以2(=2.5),等价于,等价于(float)(5)/2*/(float)(5/2)/*将将5整除整除2的结果转换成实的结果转换成实型型(2.0)*/7.5 赋值表达式赋值表达式第七章第七章 运算符和表达式运算符和表达式3复合赋值运算复合赋值运算复合赋值运算符是在赋值运算符之前再加一复合赋值运算符是在赋值运算符之前再加一个双目运算符构成的。复合赋值运算的一般格个双目运算符构成的。复合赋值运算的一般格式为:式为:变量变量 双目运算符双目运算符=表达式表达式等价:变量等价:变量=(变量变量 双目运算符双目运算符 表达式表达式)。当表达式为简单表达式时,表达式外的一对圆当表达式为简单表达式时,表达式外的一对圆括号才可以省略,否则可能出错。括号才可以省略,否则可能出错。7.5 赋值表达式赋值表达式第七章第七章 运算符和表达式运算符和表达式n例如:例如:x=5 /*等价于等价于x=x5*/y*=x3 /*等价于等价于y=y*(x3),而不是,而不是y=y*x3*/nC语言规定的语言规定的10种复合赋值运算符如下:种复合赋值运算符如下:=,=,*=,/=,%=/*复合算术运算符复合算术运算符(5个个)*/=,=,|=,=/*复合位运算符复合位运算符(5个个)*/7.5 赋值表达式赋值表达式第七章第七章 运算符和表达式运算符和表达式n例例7.1求以下算术表达式的值。求以下算术表达式的值。(1)xa%3*(int)(xy)%2/4设设x=2.5,a=7,y=4.7(2)(float)(ab)/2(int)x%(int)y设设a=2,b=3,x=3.5,y=2.5解:(解:(1)2.500000(2)3.5000007.5 赋值表达式赋值表达式第七章第七章 运算符和表达式运算符和表达式n例例7.2求以下表达式的值,设求以下表达式的值,设a=12。(1)a=a(2)a=2(3)a*=23(4)a/=aa(5)a%=(n%=2),n的值等于的值等于5(6)a=a=a*=a解:(解:(1)24(2)10(3)60(4)0(5)0(6)07.5 赋值表达式赋值表达式第七章第七章 运算符和表达式运算符和表达式7.6 自加、自减表达式自加、自减表达式1.运算符:运算符:(自加自加)、(自减)、(自减)自加运算使单个变量的值增自加运算使单个变量的值增1,自减运算使单个变量,自减运算使单个变量的值减的值减1。2.自加、自减表达式自加、自减表达式根据变量与运算符的位置不同,自加、自减表达式根据变量与运算符的位置不同,自加、自减表达式有以下四种情况:有以下四种情况:变量变量,变量变量(前置运算)(前置运算)变量变量,变量变量(后置运算)(后置运算)(1)前置运算)前置运算运算符放在变量之前,它先使变量运算符放在变量之前,它先使变量的值增的值增(或减或减)1,然后再以变化后的值参与运算,即先,然后再以变化后的值参与运算,即先增减,后运算。增减,后运算。(2)后置运算)后置运算运算符放在变量之后,它使变量先运算符放在变量之后,它使变量先参与运算,然后再使变量的值增参与运算,然后再使变量的值增(或减或减)1,即先运算,即先运算,后增减。后增减。第七章第七章 运算符和表达式运算符和表达式例例7.3自增、自减运算符的用法与运算规则示例。自增、自减运算符的用法与运算规则示例。main()int x=6,y;printf(x=%dn,x);/*输出输出x的初值的初值*/y=x;/*前置运算:前置运算:x先增先增1(=7),然后再赋值给,然后再赋值给y(=7)*/printf(y=x:x=%d,y=%dn,x,y);y=x;printf(y=x:x=%d,y=%dn,x,y);程序运行结果:程序运行结果:x=6 y=x:x=7,y=7 y=x:x=6,y=77.6 自加、自减表达式自加、自减表达式第七章第七章 运算符和表达式运算符和表达式 说明:说明:(1)自增、自减运算常用于循环语句以及指)自增、自减运算常用于循环语句以及指针变量中。它使循环控制变量加针变量中。它使循环控制变量加(或减或减)1,或,或使指针指向下使指针指向下(或上或上)一个数据的地址。一个数据的地址。(2)自增、自减运算符不能用于常量和表达)自增、自减运算符不能用于常量和表达式。例如,式。例如,5、(ab)等都是非法的。等都是非法的。(3)在表达式中,同一变量连续进行自增自)在表达式中,同一变量连续进行自增自减运算时,很容易出错,所以最好避免这种用减运算时,很容易出错,所以最好避免这种用法。法。如,表达式如,表达式d=(x)(x)(x)的值的值等于多少等于多少(假设假设x=3)?7.6 自加、自减表达式自加、自减表达式第七章第七章 运算符和表达式运算符和表达式7.7 逗号表达式逗号表达式 逗号表达式的一般形式如下:逗号表达式的一般形式如下:表达式表达式1,表达式,表达式2,表达式,表达式n 其求解过程是自左至右,依次计算各表达式其求解过程是自左至右,依次计算各表达式的值,最右边的值,最右边“表达式表达式n”的值即为整个逗号表的值即为整个逗号表达式的值。达式的值。如:求解逗号表达式如:求解逗号表达式“a=3*5,a*4”的值:的值:先求解先求解a=3*5,得,得a=15;再求解;再求解a*4=60,所,所以,逗号表达式的值为以,逗号表达式的值为60。第七章第七章 运算符和表达式运算符和表达式n注意:并不是任何地方出现的逗号,都是逗号注意:并不是任何地方出现的逗号,都是逗号运算符,很多情况下,逗号仅用作分隔符。运算符,很多情况下,逗号仅用作分隔符。如:如:printf(%d,%d,%d,a,b,c);“a,b,c”并不是一个逗号表达式,它是并不是一个逗号表达式,它是printf函数的三个参数,参数间用逗号间隔。函数的三个参数,参数间用逗号间隔。如果改写为:如果改写为:printf(%d,%d,%d,(a,b,c),b,c);则则“(a,b,c)”是一个逗号表达式,它的值等是一个逗号表达式,它的值等于于c的值,括号内作为一个表达式,括号内的的值,括号内作为一个表达式,括号内的逗号不是参数间的分隔符,而是逗号运算符。逗号不是参数间的分隔符,而是逗号运算符。7.7 逗号表达式逗号表达式第七章第七章 运算符和表达式运算符和表达式7.8关系表达式关系表达式关系表达式用来实现两个运算对象之间的大关系表达式用来实现两个运算对象之间的大小关系的比较。小关系的比较。1.关系运算符关系运算符(小于小于)、(大于大于)、=(大于或等于大于或等于)、=(等于等于)、!=(不等于不等于)关于优先级次序:关于优先级次序:(1)其中,前四个优先级别相同,后两个优)其中,前四个优先级别相同,后两个优先级别相同,前四个优先级高于后两个。先级别相同,前四个优先级高于后两个。(2)关系运算符的优先级低于算术运算符。)关系运算符的优先级低于算术运算符。(3)关系运算符的优先级高于赋值运算符。)关系运算符的优先级高于赋值运算符。第七章第七章 运算符和表达式运算符和表达式2.关系表达式关系表达式用关系运算符将两个表达式(连接起来用关系运算符将两个表达式(连接起来的式子,称为关系表达式。的式子,称为关系表达式。如:如:ab,abbc,(a=3(b=5),ab)(bc)关系表达式的值是逻辑值关系表达式的值是逻辑值“真真”或或“假假”,C语言中以语言中以“非零非零”代表代表“真真”,以,以“0”代表代表“假假”。在关系表达式求解时,。在关系表达式求解时,以以“1”代表代表“真真”,以,以“0”代表代表“假假”。当关系表达式成立时,表达式的值为当关系表达式成立时,表达式的值为1,否则,表达式的值为否则,表达式的值为0。7.8关系表达式关系表达式第七章第七章 运算符和表达式运算符和表达式如:关系表达式如:关系表达式“5=3”的值为的值为0,关系表达式关系表达式“5=0”的值为的值为1。如:如:a=3,b=2,c=1,则:,则:nab的值为的值为“真真”,表达式的值为,表达式的值为1n(ab)=c的值为的值为“真真”,表达式的值为,表达式的值为1nbcb)&(xy),(ab)|(xy)。“!”是单目运算符,只要求有一个运算对象。是单目运算符,只要求有一个运算对象。如如!(ab)。第七章第七章 运算符和表达式运算符和表达式7.9 逻辑表达式逻辑表达式高高低低!(非)!(非)算术运算符算术运算符关系运算符关系运算符&|赋值运算符赋值运算符逻辑运算符的优先级:逻辑运算符的优先级:逻辑运算符的运算规则如下:逻辑运算符的运算规则如下:a&b:仅当:仅当a、b同时为同时为真时,真时,a&b为真,其它情况为真,其它情况a&b为假为假a|b:仅当:仅当a、b同时为假时,同时为假时,a|b为假,其它情况为假,其它情况a|b为真为真!a:若:若a为真,为真,!a为假;若为假;若a为假,为假,!a为真为真第七章第七章 运算符和表达式运算符和表达式2.逻辑表达式逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来就是用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式,其的值是一个逻辑量逻辑表达式,其的值是一个逻辑量“真真”或或“假假”。n在判断一个量是否为在判断一个量是否为“真真”时,以时,以0代表代表“假假”,以非,以非0代表代表“真真”,即将一个非零的数值认作为,即将一个非零的数值认作为“真真”,n如:(如:(1)若)若a=4,则,则!a的值为的值为0,因为,因为a的值为非的值为非0,被认作被认作“真真”,对它进行,对它进行“非非”运算,得运算,得“假假”,“假假”以以0代表。代表。n(2)若)若a=4,b=5,则,则a&b的值为的值为1,因为,因为a和和b均为非均为非0,被认为是,被认为是“真真”,因此,因此a&b的值也为的值也为“真真”,值,值为为1。7.9 逻辑表达式逻辑表达式第七章第七章 运算符和表达式运算符和表达式n在逻辑表达式的求解中,并不是所有的逻辑运算符都在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。表达式的解时,才执行该运算符。如:如:n(1)a&b&c只有只有a为真(非为真(非0)时,才需要求)时,才需要求b的的值以及判别值以及判别b的值,只有的值,只有a和和b都为真的情况下才需要求都为真的情况下才需要求c的值以及判别的值以及判别c的值。只要的值。只要a为假,就不必求解和判别为假,就不必求解和判别b和和c(此时整个表达式已确定为假)。如果(此时整个表达式已确定为假)。如果a为真,为真,b为假,也不需判别为假,也不需判别c。n(2)a|b|c只要只要a为真(非为真(非0),就不必判断),就不必判断b和和c;只;只有有a为假,才判别为假,才判别b;a和和b都为假才判别都为假才判别c。7.9 逻辑表达式逻辑表达式第七章第七章 运算符和表达式运算符和表达式7.10 条件表达式条件表达式条件表达式的一般形式为:条件表达式的一般形式为:表达式表达式1?表达式?表达式2:表达式:表达式3表达式表达式1条件表达式条件表达式取表达式取表达式2的的值值条件表达式条件表达式取表达式取表达式3的的值值它的执行过程:它的执行过程:第七章第七章 运算符和表达式运算符和表达式n说明:说明:(1)条件运算符的执行顺序:先求解表达式)条件运算符的执行顺序:先求解表达式1,若为非,若为非0,则求解表达式,则求解表达式2,此时表达式,此时表达式2的的值就作为整个条件表达式的值。若表达式值就作为整个条件表达式的值。若表达式1的的值为值为0,则求解表达式,则求解表达式3,表达式,表达式3的值就是整的值就是整个条件表达式的值。个条件表达式的值。如:如:max=(ab)?a:b执行结果就是将条件表达式的值赋给执行结果就是将条件表达式的值赋给max,也就是将也就是将a和和b二者中的大者赋给二者中的大者赋给max。7.10 条件表达式条件表达式第七章第七章 运算符和表达式运算符和表达式(2)条件运算符仅优先于赋值运算符,因)条件运算符仅优先于赋值运算符,因此上面赋值表达式的求解过程是先求解此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给条件表达式,再将它的值赋给max。7.10 条件表达式条件表达式第七章第七章 运算符和表达式运算符和表达式7.11 位运算位运算n所谓位运算是指进行二进制位的运算。所谓位运算是指进行二进制位的运算。1位运算符位运算符C语言提供了语言提供了6种位运算符:种位运算符:位运算符位运算符功功 能能&按位与按位与|按位或按位或按位异或按位异或取反取反右移右移第七章第七章 运算符和表达式运算符和表达式2位运算符功能实现位运算符功能实现(1)“按位与按位与”运算运算按位与运算符按位与运算符“&”是双目运算符,其功能是双目运算符,其功能是参与运算的两数各对应的二进制位相是参与运算的两数各对应的二进制位相“与与”。只有对应的两个二进制位均为只有对应的两个二进制位均为1时,结果位才时,结果位才为为1,否则为,否则为0。参与运算的数以补码方式出现。参与运算的数以补码方式出现。7.11 位运算位运算如:如:9&5可写算式如下:可写算式如下:00001001 (9的二进制补码)的二进制补码)00000101 (5的二进制补码)的二进制补码)00000001 (1的二进制补码)的二进制补码)&9&5=1。第七章第七章 运算符和表达式运算符和表达式例例7.4“按位与按位与”运算示例运算示例main()int a=9,b=5,c;c=a&b;printf(a=%dnb=%dnc=%dn,a,b,c);程序运行结果:程序运行结果:a=9b=5c=17.11 位运算位运算第七章第七章 运算符和表达式运算符和表达式(2)“按位或按位或”运算运算按位或运算符按位或运算符“|”是双目运算符,其功能是双目运算符,其功能是参与运算的两数对应的二进制位相是参与运算的两数对应的二进制位相“或或”。只要对应的两个二进制位有一个为只要对应的两个二进制位有一个为1时,结果时,结果位就为位就为1。参与运算的两个数均以补码方式出。参与运算的两个数均以补码方式出现。现。7.11 位运算位运算如:如:9|5可写算式如下:可写算式如下:00001001 (9的二进制补码)的二进制补码)00000101 (5的二进制补码)的二进制补码)00001101 (13的二进制补码)的二进制补码)|9|5=13第七章第七章 运算符和表达式运算符和表达式例例7.5“按位或按位或”运算示例运算示例main()int a=9,b=5,c;c=a|b;printf(a=%dnb=%dnc=%dn,a,b,c);程序运行结果:程序运行结果:a=9b=5c=137.11 位运算位运算第七章第七章 运算符和表达式运算符和表达式(3)“按位异或按位异或”运算运算按位异或运算符按位异或运算符“”是双目运算符,其功是双目运算符,其功能是参与运算的两数各对应的二进制位相异或。能是参与运算的两数各对应的二进制位相异或。当两个对应的二进制位相异时,结果为当两个对应的二进制位相异时,结果为1。参。参与运算数级以补码方式出现。与运算数级以补码方式出现。如:如:95可写成算式如下:可写成算式如下:00001001 (9的二进制补码)的二进制补码)00000101 (5的二进制补码)的二进制补码)00001100 (12的二进制补码)的二进制补码)7.11 位运算位运算第七章第七章 运算符和表达式运算符和表达式例例7.6“按位异或按位异或”运算示例运算示例main()int a=9;a=a5;printf(a=%dn,a);程序运行结果:程序运行结果:a=127.11 位运算位运算第七章第七章 运算符和表达式运算符和表达式(4)“按位求反按位求反”运算运算求反运算符求反运算符“”为单目运算符,具有右结为单目运算符,具有右结合性,其功能是对参与运算的数的各二进制位合性,其功能是对参与运算的数的各二进制位按位求反。按位求反。如:如:9的运算:的运算:(0000000000001001)结果为:结果为:11111111111101107.11 位运算位运算第七章第七章 运算符和表达式运算符和表达式(5)左移运算)左移运算左移运算符左移运算符“”是双目运算符,其功能是双目运算符,其功能是把是把“”左边的运算数的各二进制位全部左左边的运算数的各二进制位全部左移,由移,由“”右边的数指定移动的位数。其中,右边的数指定移动的位数。其中,移位过程中,高位丢弃,低位补移位过程中,高位丢弃,低位补0。如:取如:取a=3,a”是双目运算符,其功能是把是双目运算符,其功能是把“”左边的运算数的各二进制位全部右移,左边的运算数的各二进制位全部右移,“”右边的右边的数指定移动的位数。移动过程中,低位丢弃。数指定移动的位数。移动过程中,低位丢弃。如:取如:取a=15,则,则 a2表示把表示把000001111右移为右移为00000011(十进制十进制3)。注意:注意:对于有符号数,在右移时,符号位将随同移动。对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补当为正数时,最高位补0,而为负数时,符号位为,而为负数时,符号位为1,最高位是补最高位是补0或是补或是补1 取决于编译系统的规定。取决于编译系统的规定。Turbo C和很多系统规定为补和很多系统规定为补1。7.11 位运算位运算第七章第七章 运算符和表达式运算符和表达式例例7.7“右移右移”运算示例运算示例main()unsigned a,b;printf(input a number:);scanf(%d,&a);b=a5;printf(a=%dnb=%dn,a,b);程序运行情况:程序运行情况:input a number:100 a=100 b=37.11 位运算位运算第七章第七章 运算符和表达式运算符和表达式7.11 位运算位运算第七章第七章 运算符和表达式运算符和表达式