资源描述
*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C语言关系运算符和位运算符,本节主要内容介绍,3.5.5 关系运算符和关系表达式,3.5.6 逻辑运算符和逻辑表达式,3.5.7 条件运算符和条件表达式,3.5.9 位运算符,3.5.10 求字节运算符,(,小于,),(,大于,),=(,大于或等于,),=(,等于,),!=(,不等于,),优先级相同(高),优先级相同(低),说明:,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符,关系运算符和关系表达式,如:ca+b,ab!=c,a=bc,建议:使用()能使关系更清晰!,c(a+b),(ab)!=c,a=(bc),用关系运算符将两个表达式可以是算术表达式或,关系表达式,逻辑表达式,赋值表达式,字符表达式,接起来的式子,称关系表达式,例:ab,a+bb+c,(a=3)(b=5),ab)(bb的值为“真,表达式的值为1。,a=3,b=2,c=1 那么关系表达式“(ab)=c的值为1,C语言中没有专用的逻辑值,1代表真,0代表假,关系运算符和关系表达式,关系运算符和关系表达式,例 int i=1,j=7,a;,a=i+(j%4!=0);,那么 a的值为,例,int a=3,b=2,c=1,d,f;,ab,(ab)=c,b+cb,f=abc,(a=5)(b=4),ab)(b 0,结果为,A 100 结果为,例 假设a=0;b=0.5;x=0.3;,那么 a=xb)=(b+c),防止类似错误:,如:要表示xa,b,不可写为:a=x=a)&(x=b),应防止对实数作相等或不等的判断。,如:结果为 0.,可改写为:fabs(1.0/3.0*3.0-1.0)3 看成“真&“真 值为1,注意:数学上关系式 0 x 100,要写成:0=x&xb&xy,a=b|x=y,!a|ab,如:,(ab)&(xy),(a=b)|(x=y),(!a)|(ab),建议:,使用()能使关系更清晰!,用逻辑运算符将关系表达式或逻辑量连接起来的式子就,是逻辑表达式。,逻辑表达式的值应该是一个逻辑量“真或“假。,例:,设a=4,b=5:,!a的值为0 a&b的值为1,a|b的值为1 !a|b的值为1,4&0|2的值为1,任何非零的数值被认作“真,逻辑运算符和逻辑表达式,例:53&84-!0,自左向右运算,1&0逻辑值为0,83逻辑值为1,表达式值为0,逻辑运算符和逻辑表达式,在逻辑表达式的求解中,,并不是所有的逻辑运算符都要被执行,。,(1)a&b&c,只有a为真时,才需要判断b的值,,只有a和b都为真时,,才需要判断c的值。,(2)a|b|c 只要a为真,就不必判断b和c的值,,只有a为假,才,判断b。a和b都为假才判断c,例:(m=ab)&(n=cd),当a=1,b=2,c=3,d=4,m和n的原值为1时,由于“ab的值,为0,因此m=0,而“n=cd不被执行,因此n的值不是0而,仍保持原值1。,逻辑运算符和逻辑表达式,逻辑运算符和逻辑表达式,例3.12 逻辑表达式的不完全计算,void main(),int a,b,c,d;,a=0;,b=1;,c=a+,d=a+|b+;,printf(a=%d,b=%d,c=%d,d=%dn,a,b,c,d);,a=2,b=1,c=0,d=1,逻辑运算符和逻辑表达式,逻辑运算符的应用:,(1)表示成绩grade)在90以上(含)和60分以下的情况:,grade=90|grade0&(x%2=0),(3)判断闰年的条件是符合以下两种之一:,能被4整除,但不能被100整除;能被400整除,(year%4=0&year%100!=0)|(year%400=0),(4)表示 x 是数字字符的情况,x=0&x=48&xy+Bx=y-z Dy%z=y-z,2、x为奇数时值为“真,x为偶数时值为“假,表达式是 ,A!(x%2=1)Bx%2=0,Cx%2 D!(x%2),3、已有定义语句:int m=0,n=1;执行表达式(m=59)后,n的值是 ,A1 B2 C3 D4,4、已有定义语句:int m=0,n=3;执行表达式(m=53)|(n=7=100)&(s300)(B)100=s=100)&(s=100)and(s300),6假设定义 int a=2,b=3;那么表达式!a|b 的值为 。,(A)0 (B)1 (C)2 (D)3,7设整型变量x为7,使整型变量y不为2的表达式是 。,(A)y=x%3 (B)y=x/3,(C)y=(+x)/3 (D)y=8-(-x),C语言提供了一个简单的条件赋值语句或条件表达式。,一般形式,表达式1?表达式2:表达式3,功能:先判表达式1,假设非0,那么值为表达式2的值,否那么为表达式3的值。,条件运算符的优先级高于赋值运算符,但低于关系运算符和逻辑运算符。例如:,a=1;b=2;,c=ab?3:4;,main(),int i=3,j=5,k;,k=ib?(a=100):(b=100),ab?printf(%d,a):printf(%d,b),表达式2、表达式3的类型可以不同,此时条件表达式值取二者中较高的类型。,如:xy?1:1.5,/假设xy,那么;假设xb)?a:b;,printf(max=%fn,max);,条件运算符和条件表达式,例:输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。,程序,:,#include,void main(),char ch;,scanf(%c,ch=(ch=A,printf(%cn,ch);,运行结果:,输入:A,输出:a,应用运算符和表达式应注意,运算符功能,运算符与运算对象的关系,要求运算对象的个数,要求运算对象的类型,运算符的,优先级,运算的,结合方向,运算结果的类型,混合运算中的类型转换,条件运算符和条件表达式,概念,位运算是指按二进制位进展的运算。因为在系统软件中,常要处理二进制位的问题。,例如:将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。,语言提供位运算的功能,与其他高级语言如PASCAL相比,具有很大的优越性。,位运算符,语言提供的位运算符有:,运算符 含义 运算符 含义,按位与,取反,|,按位或,右移,(1)位运算符中除以外,均为二目元运算符,即要求两侧各有一个运算量。,(2)运算量只能是整型或字符型的数据,不能为实型数据。,说明:,1、“按位与运算符,按位与是指:参加运算的两个数据,按二进制位进展“与运算。如果两个相应的二进制位都为,那么该位的结果值为;否那么为。即:,,,例:并不等于,应该是按位与运算:,注意:如果参加&运算的是负数如-3&-5,那么要以补码形式表示为二进制数,然后再按位进展“与运算。,3&5的值得,(3),&,(5),(1),“按位与运算符,按位与运算有两个特点:和二进制位数0相与那么该位被清零;和二进制位数相与那么该位保存原值不变。利用这两个特点,可以指定一个数的某一位(或某几位)置0,也可以检验一个数的某一位(或某几位)是否是。,例如:a=a只保存a的右端两位二进制位数。,又如:假设a&4 值为4,那么变量a的右端第3位为。,按位与运算符“&和逻辑与运算符“&不同,对于逻辑与运算符“&,只要两边运算数为非0,运算结果为 1。例如41&165 的值是 1。,2、“按位或运算符|,两个相应的二进制位中只要有一个为,该位的结果值为。,即|,|,|,|,例:060|017,将八进制数60与八进制数17进展按位或运算。,|,00111111,“按位或运算符,0000 0000 0010 1001 (十进制数41),0000 0000 1010 0101 (十进制数165),0000 0000 1010 1101 (十进制数173),利用按位或运算的特点,可以指定一个数的某一位(或某几位)置1,其它位保存原值不变。,例如:a=a|3;把a的右端两位二进制位数置1,其它位保存原值不变。,a=a0 xff;把a的低字节全置1,高字节保持原样。,a=a0 xff00;把a的高字节全置1,低字节保持原样。,3、“异或运算符,异或运算符也称XOR运算符。它的规那么是:,假设参加运算的两个二进制位同号那么结果为假,异号那么结果为真,即:00=0,01=1,10=1,11=0,例:,即:071052=023 八进制数,“异或运算符,例如:int a=41165;那么a的值为140,运算过程用二进制表示如下:,0000 0000 0010 1001 (十进制数41),0000 0000 1010 0101 (十进制数165),0000 0000 1000 1100 (十进制数140),按位异或运算可以把一个数的二进制位的某一位(或某几位)求反(0变1,1变0)。例如:a=a3;将变量 a 的最右端的二位求反。,4、“取反运算符,是一个单目元运算符,用来对一个二进制数按位取反,即将变,将变。,例如,是对八进制数即二进制数按位求反。,10101,(),1111111111101010,(,八进制数177752),“取反运算符,例如:int i=199;那么:i值为-200,这是因为:,十进199写成二进制:,0000 0000 1100 0111,把它按位取反 1111 1111 0011 1000,这个数是整型十进制数-200在内存的补码表示。1111111 0011 0111,1000,5、左移运算符,左移运算符是用来将一个数的各二进制位全部左移假设干位。,例如:a=2 将的二进制数左移位,右补。,假设,即二进制数,,左移位得,(十进制数,高位左移后溢出,舍弃。,char a=5,b;,b=a3;a的二进制值为 0000 0101,执行语句b=a),右移运算符是a2表示将a的,各二进制位右移2位,,,移到右端的低位被舍弃,右移时,对于正整数和无符号整数,高位(左端)补0;,对于负数,高位(左端)补1(,补码表示法最高位1表示负数)。,例如:,char a=41,b;,b=a3;,用二进制来表示,a的值为 0010 1001(十进制数41),执行语句b=a3;之后b 的值为 0000 0101(十进制数5=41/2/2/2,注意是整数除),运算后a的值并没有改变仍为41)。,右移时,每右移1位,相当于除以 2(整数除),。,7.位运算赋值运算符,它们是:=,=2相当于a=a2,b|=c 相当于b=b|c,8.位运算优先关系,例如:语句,a=10,执行后a的值为8。“=y;运行后z的值为_。,3假设定义 int a=-5,b=-8,c=-12;那么表达式 a=b|bc 的值为 。,4int a,b;那么表达式(a=2,b=5,a*2,+b,a+b)的值是_。,5int m=5,n=3;那么表达式(m+1,n+1,(-m)+(n-)的值是_。,课 堂 练 习,6假设有定义:int a,b;double x,那么以下不符合C语言语法的表达式是 。,(A)x%(-3)(B)a+=-2 (C)a=b=2 (D)x=a+b,7假设有定义:int b=7;float a=2.5,c=4.7;那么表达式a+(b/2*(int)(a+c)/2)%4 的值是 。,(A)2.5 (B)3.5 (C)4.5 (D)5.58,8已定义 char c=A;那么正确的赋值表达式是 。,(A)c=028 (B)c=(c+)%4,(C)c+1=66 (D)c+=127-,课 堂 练 习,9定义:int x=4,y=2,z=0;那么表达式(x-y=y)|(y=z)的值是 。,(A)1 (B)0 (C)2 (D)4,10下面表达正确的选项是 。,(A)强制类型转换运算的优先级高于算术运算,(B)假设a和b是整型变量,(a+b)+是合法的,(C)A*B 是不合法的 (D)A+B是合法的,11假设a为奇数时,表
展开阅读全文