《三章运算符和表达式》由会员分享,可在线阅读,更多相关《三章运算符和表达式(56页珍藏版)》请在金锄头文库上搜索。
1、第三章第三章第三章第三章 运算符和表达式运算符和表达式运算符和表达式运算符和表达式 武汉大学计算机学院武汉大学计算机学院武汉大学计算机学院武汉大学计算机学院主讲:谭成予主讲:谭成予教教 材材: C程序设计导论程序设计导论倦巨衅粹溢掂迅忆疙湿片羊耻铁鹰欺镍共拧呸件茶舔你坞框栽指治票十许三章运算符和表达式三章运算符和表达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结合性优先级别和结合性C运算符分类运算符分类费鄂班兜虎现波档担釜梳铁铸功亮庄贩拼速栓缺泅闻夫搅厕珍断械眨莲哮三章运算符和表达式三章运算符和表达式运算符及表达式简介运算符及表达式简介表达式:表达式:由动词(运算符
2、和函数调用)和名词(变量和常量)组成的由动词(运算符和函数调用)和名词(变量和常量)组成的一个完整的句子,说明了动词是如何运用到名词上产生一个结果。一个完整的句子,说明了动词是如何运用到名词上产生一个结果。运算符:运算符:完成特定运算功能的符号。完成特定运算功能的符号。C C语言语言运算符的类型运算符的类型:算术运算符算术运算符 赋值运算符赋值运算符关系运算符关系运算符 逻辑运算符逻辑运算符条件运算符条件运算符 位运算符位运算符 逗号运算符逗号运算符 其他运算符其他运算符运算运算符符的优先级与结合性的优先级与结合性曼呈驭撬袄洪捌盖嗣吕霖瘁鞍艇洒殃受胶曲锄烷播榴恕汤尾且呼仪黎揭雪三章运算符和表达
3、式三章运算符和表达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结合性优先级别和结合性C运算符分类运算符分类运算符运算规则运算符运算规则 算术运算符算术运算符褐稠完干薄鉴香踩药卞眯及帆邱箍务湘荆痞楼童窖烙坏敛整汤宴瑚绍访稿三章运算符和表达式三章运算符和表达式算术运算符算术运算符+ - * / %+ - * / %(求余)(求余) + + +(自增)(自增) - - -(自减)(自减)使用要点:使用要点: 1 1)两个整型数相除,其结果为整型;两个整型数相除,其结果为整型; 如:如:10/3=310/3=3 -5/3=-1 -5/3=-1 (负数采用(负数采用“向零取整
4、向零取整”) 2 2)% %运算符的两个操作数必须是整型;运算符的两个操作数必须是整型; 如:如:7%4=37%4=3 特别情况:特别情况: 0%5=0 0%5=0;5%0=55%0=5; -7%4=-3 -7%4=-3;-7%-4=-3-7%-4=-3; 7%-4=3 7%-4=3。 即:即: % %运算的符号只取决于第一个运算数的符号。运算的符号只取决于第一个运算数的符号。 耐磁柄彦貉沁脓拱洛竞遁府咎腊爬鹊喳劈尉昼模驭肇娟饭悔蹲则蝴柏胚辐三章运算符和表达式三章运算符和表达式算术运算符算术运算符双目运算符:双目运算符:如如 +、-、*、/和和%;单目运算符:单目运算符:如如 “+”和和“-”
5、还可分别作为取正值、负值运算还可分别作为取正值、负值运算符。符。 单目运算符单目运算符“+”和和“-”优先级别高于双目运算符优先级别高于双目运算符+、-、*、/和和%;双目运算符的优先级别:先乘除(双目运算符的优先级别:先乘除(*、/或或%),后加减(),后加减(+或或-)勇椭藕蜡乌苇坍逢摧赘雹擦编剃幻葛瑶敦殃滚耶颜嘘惮味卖锁芋计膨欺移三章运算符和表达式三章运算符和表达式算术运算符算术运算符x=30x=30x=24x=24x=11x=11x=1x=1x=0x=0x=1x=1y=25.0000y=25.0000/*L3-1.C:算术运算符示例算术运算符示例*/#include int main(
6、void) short int x,a=3;float y;x=20+25/5*2; printf(“x=%dn”,x);x=25/2*2; printf(“x=%dn”,x);x=-a+4*5-6; printf(“x=%dn”,x);x=a+4%5-6; printf(“x=%dn”,x);x=-3/4%-6/5; printf(“x=%dn”,x);x=(7+6)%5/2; printf(“x=%dn”,x);y=25.0/2.0*2.0; printf(“y=%.4fn”,y); return 0; 固钉饯翼赛卓鹅娃雅昆快瞪在诬溜夷众畸糠遗棘芥较撬伏徐寨绞间垫焊侩三章运算符和表达式三章
7、运算符和表达式自增、自减运算符自增、自减运算符+ + 自增运算符自增运算符,表示加表示加1运算运算 - - 自减运算符自减运算符,表示减表示减1运算运算 前缀形式前缀形式:在计算时先改变变量的值,再参与其它运算在计算时先改变变量的值,再参与其它运算. + +i - -i 例:若例:若 i=1, 则则 k=+ +i +2 运行后运行后 i=2、k=4 后缀形式:后缀形式:在计算时先参与其它运算,再改变变量的值在计算时先参与其它运算,再改变变量的值. i+ + i- -例:若例:若 i=1, 而而 k=i+ + +2 运行后运行后 i=2、k=3亏煎众绽卡栗断殴淖哀涌鄂醇凰耗蕉皇鄂萌栋划秘宁天液烬
8、汝忙纹舌轿尝三章运算符和表达式三章运算符和表达式+ +与与- -运算符的使用规则:运算符的使用规则:+ +与与- -运算只能运算只能用于有左值的表达式用于有左值的表达式,而不能用于常量,而不能用于常量或一般的表达式。或一般的表达式。 如:如:5+ +或(或(a+b)+ +为不合法的。为不合法的。+与与-运算符的的结合性为运算符的的结合性为右结合性右结合性。自增、自减运算符自增、自减运算符蹿空抨贺模凸缕称笨滤宝岭猴赊喘揣驮儒矗耘痰祸哩昨慑铁哮桅焚会钝门三章运算符和表达式三章运算符和表达式 /*L3-2.C:自增、自减运算符举例自增、自减运算符举例*/ #include int main()sho
9、rt int a,b,c; a=9;b=+a;printf(“(1)a=%d*b=%dn”,a,b);a=9;b=a+;printf(“(2)a=%d*b=%dn”,a,b); return 0; (1)a=10*b=10(1)a=10*b=10(2)a=10*b=9(2)a=10*b=9自增、自减运算符自增、自减运算符捅儒捷汐礼舞阎揩俏驱甭刃斋胆贤秧餐伊奎露枚畦版贡毖仇营峙偏系免贱三章运算符和表达式三章运算符和表达式正确使用自增、自减运算符正确使用自增、自减运算符对对i+ + +j 表达式的处理:采用表达式的处理:采用“自左至右自左至右”的原则的原则即:即: i+ + +j 与(与(i+ +
10、)+j 等价等价而不是与而不是与i+(+ +j )等价)等价胞搪踏挖懊庙向么欲埠魁扎耐虾犯碗在庭彬漫衔岩券氢茸接丧疲辩腋禾凌三章运算符和表达式三章运算符和表达式1.对于代码对于代码int i = 3; i = i+; 不同编译器给出不同的结果不同编译器给出不同的结果, 有有的为的为3, 有的为有的为4, 哪个是正确的?哪个是正确的?2.为什么这样的代码为什么这样的代码: ai = i+; 不能工作?不能工作?1.对于代码对于代码int i = 3; i = i+; 不同编译器给出不同的结果不同编译器给出不同的结果, 有有的为的为3, 有的为有的为4, 哪个是正确的哪个是正确的?答答: 没有正确
11、答案没有正确答案; 这个表达式无定义。注意这个表达式无定义。注意, i+ 和和+i 都不都不同于同于i+1。如果你要使。如果你要使i 自增自增1, 使用使用i=i+1, i+=1, i+ 或或+i, 而不是任何组合而不是任何组合.正确使用自增、自减运算符正确使用自增、自减运算符赃啮下弧捆晚弦静忆澳辣红险菩潭龚王拌僻祷零沛氟晦公焉仟皱裤吹须槐三章运算符和表达式三章运算符和表达式如:如: 若若i=3,则表达式(,则表达式(i+ +)+(i+ +)+(i+ +)的结果应为)的结果应为多少?多少? 有的系统从左到右顺序完成括号中的运算,即表达式经过为有的系统从左到右顺序完成括号中的运算,即表达式经过为
12、3+4+5=12。另外一些系统(如另外一些系统(如Turbo C、MS C)则先计算表达式的值,再自则先计算表达式的值,再自加加3次次i,即表达式结果为,即表达式结果为3+3+3=9。正确使用自增、自减运算符正确使用自增、自减运算符航桓全煮诬茨哲锣断无子磋撒绞卖垮烦球逐狐溅掉婆苍赘虫撞算芬赦涎硫三章运算符和表达式三章运算符和表达式对对printf(“%d,%d”, i,i+ +);的理解的理解若若 i=3 ,则在则在Turbo C中对输出函数参数的求值顺序中对输出函数参数的求值顺序采用采用“自右至左自右至左”结果为:结果为:4,3(而不是(而不是3,3)不要滥用增量运算符不要滥用增量运算符;
13、增量运算符有副作用增量运算符有副作用,会改变运算分量的值会改变运算分量的值但是如果使用不当,会带来意想不到的结果但是如果使用不当,会带来意想不到的结果.正确使用自增、自减运算符正确使用自增、自减运算符古风操炭闺鉴赖傅译虏修忘捏松氛讽珊拾肪妹歧么隅畸缴妖卜藏识共蘸瘁三章运算符和表达式三章运算符和表达式1.对于代码对于代码int i = 3; i = i+; 不同编译器给出不同的结果不同编译器给出不同的结果, 有有的为的为3, 有的为有的为4, 哪个是正确的?哪个是正确的?2.为什么这样的代码为什么这样的代码: ai = i+; 不能工作?不能工作?2.为什么这样的代码为什么这样的代码: ai =
14、 i+; 不能工作?不能工作?答答: 子表达式子表达式i+ 有一个副作用有一个副作用 它会改变它会改变i 的值的值 由于由于i 在同一表达式的其它地方被引用在同一表达式的其它地方被引用, 这会导致无定义的结果这会导致无定义的结果, 无从判断该引用无从判断该引用(左边的左边的ai 中中)是旧值还是新值。是旧值还是新值。正确使用自增、自减运算符正确使用自增、自减运算符羞搀馁入晴珍捎娠货黑漓密蘸抉征螺聊匝悠弟茫茵陡打臣睁培巍肥崭归疫三章运算符和表达式三章运算符和表达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结合性优先级别和结合性C运算符分类运算符分类运算符运算规则运算符
15、运算规则 赋值运算符赋值运算符窍化皮霸缉搔堆抽卿撮檀闻抚狞辰粱身扰卢拷澜他取廉堤谴堵茁王招摩漫三章运算符和表达式三章运算符和表达式赋值运算符赋值运算符 变量变量=表达式表达式含义:将含义:将“=”右边的运算对象之值赋给左边的运算对象。右边的运算对象之值赋给左边的运算对象。 如:如:x=1; x=x+1;使用要点:使用要点:(1)赋值运算符左边的量(称为左值)一般是变量。)赋值运算符左边的量(称为左值)一般是变量。(2)当)当“=”两边数据类型不同时,将进行数据类型的自动转换,原则是:两边数据类型不同时,将进行数据类型的自动转换,原则是:以以“=”左边运算对象的数据类型为准。左边运算对象的数据类
16、型为准。 如:如: int x; float y=3.5; x=y; 则运行结果为则运行结果为int型型赦员凳丁摩悯杜搅药寿猿厄便凹暗屠钵喻喝撇览弊七肄佬景蓄沂扭等馏缀三章运算符和表达式三章运算符和表达式赋值表达式赋值表达式求解过程:求解过程: 赋值运算符按照赋值运算符按照“右结合性右结合性”顺序运算,将顺序运算,将“= =”右边表达式的值赋值给左边的变量。右边表达式的值赋值给左边的变量。表达式值为表达式值为3 3,a,b,ca,b,c值均为值均为3 3表达式值为表达式值为7 7,a a值为值为7 7,c c为为2 2表达式值为表达式值为1010,a=10,b=4,c=6a=10,b=4,c=
17、6表达式值为表达式值为5 5,a=5,b=10,c=2a=5,b=10,c=2若若a=12a=12,(,(1 1)则)则a-=a*a a-=a*a 后,后,a=-132a=-132,(,(2 2)a+=-132a+=-132后,后,a=-264a=-264使用举例:使用举例:a=b=c=3 a=b=c=3 a=5+(c=2)a=5+(c=2)a=(b=4)+a=(b=4)+(c=6)c=6)a=(b=10)/(c=2)a=(b=10)/(c=2)a+=a-=a*aa+=a-=a*a集雪蒙乘奶纷吨寄崖友阎亩杆径化斡芥喝嘘饵厉世苫稽丸千姿羚邵谣豺睹三章运算符和表达式三章运算符和表达式赋值表达式赋值
18、表达式注意:注意:(1)区分赋值语句和赋值表达式;)区分赋值语句和赋值表达式;(2)赋值表达式不仅可以出现在赋值语句中,也可以出现在)赋值表达式不仅可以出现在赋值语句中,也可以出现在其它语句中。其它语句中。(3)赋值运算符的优先级别今比逗号运算符级别高,低于其)赋值运算符的优先级别今比逗号运算符级别高,低于其他运算符。他运算符。(4)赋值表达式的值等于右边表达式的值。)赋值表达式的值等于右边表达式的值。陕亮糟纪检厩烹洗擅掩潭春讯试肤温厌几签股但用子淫村爷葛呵汞泥茶簧三章运算符和表达式三章运算符和表达式赋值运算时不同类型数据间的自动转换赋值运算时不同类型数据间的自动转换1 1、实型数据赋值给整型
19、数据时,舍弃小数部分;实型数据赋值给整型数据时,舍弃小数部分; 即:即:int=floatint=float的结果为的结果为intint型。型。如:如:float a; int s; a=12.34; s=a; 这时这时s的值为的值为12。2 2、将整型数据赋值给实型变量时,数值不变,但数据是浮点形式的将整型数据赋值给实型变量时,数值不变,但数据是浮点形式的; 即即float=intfloat=int的结果为的结果为floatfloat型。型。如:如:int s;int s; float a; float a; s=12; a=s; s=12; a=s; 这时这时a a的值为的值为12.000
20、0012.00000。剔谷剪匹扶橱圆蛆镀糜漆膨恍铣袁哉位升瘪署赣萤恳咽傍肄聚希疵淀陈掸三章运算符和表达式三章运算符和表达式赋值运算时不同类型数据间的自动转换赋值运算时不同类型数据间的自动转换3、当字符数据赋值给整型变量时,则将字符数据放到整型变量的低当字符数据赋值给整型变量时,则将字符数据放到整型变量的低8位中位中,高高8位数根据的存放数据有两种情况:位数根据的存放数据有两种情况: 即:即: int=char 当当char为无符号或为无符号或unsigned char时,高时,高8位应补位应补0; 如:如:unsigned char c; int x; c=376;(八进制数八进制数376)
21、x=c; 则则x的值为的值为254。当当char为有符号数据时,高为有符号数据时,高8位需进行位需进行“符号位扩展符号位扩展”,即高,即高8位位将依据符号位的值来决定是补将依据符号位的值来决定是补0或补或补1; 如:如:char c; int x; c=376; (八进制数八进制数376) x=c; 则则x的值为的值为-2。1 1 1 1 1 1 1 01 1 1 1 1 1 1 01 1 1 1 1 1 1 01 1 1 1 1 1 1 00 0 0 0 0 0 0 00 0 0 0 0 0 0 01 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 01
22、1 1 1 1 1 1 01 1 1 1 1 1 1 01 1 1 1 1 1 1 0仔盾期泳洼剑兴瞄柿俘构樊觅余宛务漓瘩境忧痹藻婚皋勇电懂袖舰碟偷囚三章运算符和表达式三章运算符和表达式赋值运算时不同类型数据间的自动转换赋值运算时不同类型数据间的自动转换4 4、将带符号的整型数据赋值给长整型数据时,要进行符号扩展。将带符号的整型数据赋值给长整型数据时,要进行符号扩展。如果如果intint型数据为正值,则型数据为正值,则long int long int 型数据的高型数据的高1616位补位补0 0;如果;如果intint型数据为负型数据为负值,则值,则long int long int 型数据的
23、高型数据的高1616位补位补1 1,以保持其原有数据不变。,以保持其原有数据不变。5 5、将将 long int long int 型数据赋值给型数据赋值给intint型数据时,只将型数据时,只将long int long int 型数据的低型数据的低1616位原封不动的送到位原封不动的送到int int 型变量中去(截断)。型变量中去(截断)。6 6、将、将unsigned intunsigned int型数据赋值给型数据赋值给long intlong int型数据时,不存在符号扩展问型数据时,不存在符号扩展问题,只需将高位补题,只需将高位补0 0;将;将unsigned intunsign
24、ed int型数据赋值给型数据赋值给 int int型数据时,有型数据时,有可能出现错误数据。可能出现错误数据。 如:如: int a;int a; unsigned b=65535; unsigned b=65535; a=b; a=b; printf( printf(“%dn%dn”,a);,a); 此时此时a a的值为的值为-1-1。1111 1111 1111 11111111 1111 1111 11111111 1111 1111 11111111 1111 1111 1111油叁桔客麻肘教唁康厦獭撕酌穆缠暑郑秧档己诌磺番眶度茄炼肤下胞搐烙三章运算符和表达式三章运算符和表达式复合赋
25、值运算符复合赋值运算符在赋值运算符在赋值运算符“= =”之前加上其它运算符构成的运算符。之前加上其它运算符构成的运算符。 表达式表达式1 1 运算符运算符= =表达式表达式2 2 等价于:等价于:表达式表达式1=1=表达式表达式1 1 运算符运算符 ( (表达式表达式2)2) a+=3 a+=3 等价于等价于 a=a+3 a=a+3x*=3 x*=3 等价于等价于 x=x*3 x=x*3x%=3 x%=3 等价于等价于 x=x%3 x=x%3x/=y+3 x/=y+3 等价于等价于 x=x/(y+3) x=x/(y+3)使用要点使用要点凡是二元(二目)运算符,都可以与凡是二元(二目)运算符,都
26、可以与“= =”组合成复合赋值符组合成复合赋值符 如:如:+=,-=,*=,/=,%=,=,&=,=,|=+=,-=,*=,/=,%=,=,&=,=,|=等。等。使用复合赋值符的目的:简化程序;提高编译效率。使用复合赋值符的目的:简化程序;提高编译效率。抄途龋漂匝坤毯绸佰奋警垮样半嘎而虹鸡咖寒讶撒挟兑话治殃幅汀锣瓣赵三章运算符和表达式三章运算符和表达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结合性优先级别和结合性C运算符分类运算符分类运算符运算规则运算符运算规则 关系运算符关系运算符薄起掠稍灯纶芥缓裤了佰谍丽吧窃颗刑浸注轮晨绊哭残腋剂斤狼邑琳糯肿三章运算符和表达式
27、三章运算符和表达式关系关系运算符运算符关系运算符用于判断各个运算对象之间的相互关系关系运算符用于判断各个运算对象之间的相互关系符号类型:符号类型: 、=、=、!=!=优先级:优先级: 、=的优先级相同,而的优先级相同,而= = =、!=!=优先级相同,且前者高于后优先级相同,且前者高于后者;者;关系运算符的优先级低于算术运算符,高于赋值运算符。关系运算符的优先级低于算术运算符,高于赋值运算符。例:例:ca+b ca+b 等价于等价于 c(a+b) c(a+b) 算术运算符算术运算符 高高ab!=c ab!=c 等价于等价于 (ab)!=c (ab)!=ca= =bc a= =bc 等价于等价于
28、 a= =(bc) a= =(bc a=bc 等价于等价于 a=(bc) a=(bc) 关系运算符关系运算符 低低皑象阑好跪踞蔷如严评氦猖谗登泅滨旧辖也池著程落性总胎绍烬办盐厄侠三章运算符和表达式三章运算符和表达式关系关系表达式表达式 用关系运算符将两个表达式连接起来的式子用关系运算符将两个表达式连接起来的式子(连接的连接的表达式可以是算术表达式也可以是关系表达式、逻表达式可以是算术表达式也可以是关系表达式、逻辑表达式、赋值表达式、字符表达式)辑表达式、赋值表达式、字符表达式)例如:例如:ab、 a+bc-d、(a=3)(b=5)、ab)(bb的值为的值为“0”; 而而ac的值为的值为“1”;
29、 表达式表达式c=ab的值为的值为“0”; 表达式表达式a!=b+c的值为的值为“1”。C语言识别表达式是否成立的方法是:语言识别表达式是否成立的方法是:所有值为所有值为“0”的表达的表达式表示式表示“假假”,所有值为所有值为“非零非零” 的表达式都表示的表达式都表示“真真”。请区别:请区别:x=1 与与 x= =1 的不同。的不同。烟桨慕愚奎揪召睦醋丽俘逛挫户沮莲惰娶哭贬夕舌虎踩幌恐硫恶岗蹭邦浑三章运算符和表达式三章运算符和表达式关系关系表达式表达式 /*L3-3.C:*/#include int main(void)int a,b,c;a=b=c=10;a=b= c;printf(“a=%
30、d,b=%d,c=%dn”,a,b,c);a=(b=c+*2);printf(“a=%d,b=%d,c=%dn”,a,b,c);a=bc=100;printf(“a=%d,b=%d,c=%dn”,a,b,c); return 0;a=1,b=10,c=10a=1,b=10,c=10a=1,b=20,c=11a=1,b=20,c=11a=0,b=20,c=11a=0,b=20,c=11糟挛哉秸怨灸平驴抓火授兄怎芝玄瀑死壹霄居亮恰脐畅舀禽形淳吁脾燃西三章运算符和表达式三章运算符和表达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结合性优先级别和结合性C运算符分类运算符分类
31、运算符运算规则运算符运算规则 逻辑运算符逻辑运算符鸥侗孜账奇惮街俩悟向跪驶辱详墙墅务丹羊灵砒扳停妮饵之比七囚堑贪腋三章运算符和表达式三章运算符和表达式逻辑运算符逻辑运算符1、含义:逻辑运算符用于完成逻辑(布尔)运算。、含义:逻辑运算符用于完成逻辑(布尔)运算。2、符号类型:、符号类型:&(逻辑与)、(逻辑与)、|(逻辑或)、(逻辑或)、!(逻辑非)(逻辑非)3、优先级优先级:!优先级别高于优先级别高于&和和|,而而&又高于又高于|。4、使用要点、使用要点在在C语言中语言中,没有逻辑型的数据没有逻辑型的数据,以以“1”代表代表“真真”,以,以“0”代代表表“假假”。逻辑运算规则:逻辑运算规则:
32、& 参与运算的表达式同时为真,参与运算的表达式同时为真, 则则&运算的结果为真;运算的结果为真; | 参与运算的表达式其中之一参与运算的表达式其中之一 为真,则为真,则|运算的结果为真;运算的结果为真; ! 为单目运算符,取运算对象的相反值。为单目运算符,取运算对象的相反值。逻辑运算真值表逻辑运算真值表绥朔涟脓嚏揽绊碍畜峰亏写拐荔嚼窄青柬绸赦乓咋碴花邮稿矗砰瘴绑无兔三章运算符和表达式三章运算符和表达式逻辑运算逻辑运算短路原则短路原则a & b 当当a为为0时,可提前计算表达式结果为时,可提前计算表达式结果为0,因此不在,因此不在计算计算b。 例如,设变量例如,设变量int m,n,a,b的值均
33、为的值均为0,则执行表达式,则执行表达式(m=a=b)|(n=a=b)后,后,m, n 的值分别为(的值分别为( )和)和( )。)。 a | b 当当a为为1时,可提前计算表达式结果为时,可提前计算表达式结果为0,因此不在计算,因此不在计算b。舶就燎贵痢郊尹抛汞融揭樟煌蔓坏材茶勺圣歌通蹋彻匈浸籽乒栽耿耳蘸堑三章运算符和表达式三章运算符和表达式逻辑运算符逻辑运算符/*L3-4.C: 判断一年是否是闰年判断一年是否是闰年*/*分析:如果年号能被分析:如果年号能被4整除而不能被整除而不能被100整除,或者能被整除,或者能被400整除就是闰年;整除就是闰年;否则就是平年。否则就是平年。*/#incl
34、ude int main(void)int year,leap;printf(“Input your year:n”);scanf(“%d”,&year);leap=year%4=0&year%100!=0|year%400=0;if (leap)printf(“%d is a leap year.n”,year);elseprintf(“%d is not a leap year.n”,year); return 0;Input your year:19441944 is a leap year.谢屠某冰刮阁足凳嚎尊创爸涤亿议阵现闺丙轻篮密修铣秸仁曙官喊符缴乘三章运算符和表达式三章运算符和表
35、达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结合性优先级别和结合性C运算符分类运算符分类运算符运算规则运算符运算规则 条件运算符条件运算符怔供晋猿震夜絮工蜀燃寡徐舀睫夜型梦钞卞号酬茹枯屠萎哗杉浊凳构雀尖三章运算符和表达式三章运算符和表达式条件运算符条件运算符表达式表达式1?表达式表达式2:表达式表达式3条件运算符的执行顺序条件运算符的执行顺序 先求表达式先求表达式1,若为真则求解表达式若为真则求解表达式2,整个表达式的值为表达式整个表达式的值为表达式2的值的值;若若表达式表达式1的值为假则求解表达式的值为假则求解表达式3,整个表达式的值为表达式整个表达式的值为表达
36、式3的值的值.条件运算符的优先级别高于赋值运算符,但低于其他运算符。条件运算符的优先级别高于赋值运算符,但低于其他运算符。条件表达式中表达式条件表达式中表达式1的类型可以与表达式的类型可以与表达式2和表达式和表达式3的类型不一致的类型不一致.表达式表达式2与表达式与表达式3的类型也可以不一致的类型也可以不一致.逼慰歇谤嵌柑袁赖劲渔咒写霓柏谩巷脉数悠倪德娜骋摹阿再矩途钦寻橙霖三章运算符和表达式三章运算符和表达式条件运算符条件运算符/*L3-5.c: 条件运算符范例条件运算符范例*/#include int main(void)float x=1.0; int a=2,b=3; x=(ab)?a:
37、b; printf(“%.4f”,x); return 0; 3.0000条件表达式条件表达式(ab)?a:b的值为整型数据的值为整型数据,但但x为实型数据为实型数据,所以输出为实型数据所以输出为实型数据.趴称牧拷徒民膛拖瓦杭敌跟捷鹏污烬筏诚破塔犊搪酒域棱灌鹅激喘瞅醒努三章运算符和表达式三章运算符和表达式条件运算符条件运算符 /*L3-6.C:*/ /*L3-6.C:*/#include #include int main(void)int main(void) int a,b,c;int a,b,c;a=b=c=1;a=b=c=1;a+=b;a+=b;b+=c;b+=c;c+=a;c+=a;
38、printf(“(1)%dn”,ab?a:b);printf(“(1)%dn”,ab?a:b);printf(“(2)%dn”,ac?a-:c+);printf(“(2)%dn”,ac?a-:c+);(a=b=c)?printf(“AA”):printf(“CC”);(a=b=c)?printf(“AA”):printf(“CC”);printf(“na=%d,b=%d,c=%dn”,a,b,c);printf(“na=%d,b=%d,c=%dn”,a,b,c); return 0; return 0; (1 1)2 2(2 2)3 3CCCCa=2,b=2,c=4a=2,b=2,c=4中肃几
39、绽趾殿旭区芜搂苦心挺渴硷忿献狂痰瓢昔挑宋构女疮碧突私崭椅碍三章运算符和表达式三章运算符和表达式条件运算符条件运算符例例3.7:计算下面的函数:计算下面的函数 1 x0 sign(x)= 0 x=0 1 x0#include int main(void)float x;scanf(“%f”,&x);printf(“sign(%f) is %d”,x,x 0 ? 1 : ( x = = 0 ? 0 : 1); return 0;惩钡络赣辰枷著朔蝎员挞壤椰肚嚎换抑洗垄嘘兆叉抖肩茹黎起括意纠旗洪三章运算符和表达式三章运算符和表达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结
40、合性优先级别和结合性C运算符分类运算符分类运算符运算规则运算符运算规则 位运算符位运算符履啊辽晋亩融钙袋耽仆潮买仿烤橇倾增帚判曝他抄撰巢榴抱饮暮原雪保警三章运算符和表达式三章运算符和表达式位运算符位运算符-位逻辑运算符位逻辑运算符1 1 组成:组成:& &(按位与)(按位与) | |(按位或)(按位或) (按位反)(按位反) (按位异或)(按位异或)2 2 运算规则:位逻辑运算是按二进制一位一位进行运算,相邻位之间没有进位和借位等问题。运算规则:位逻辑运算是按二进制一位一位进行运算,相邻位之间没有进位和借位等问题。 & &、| |和和 运算符的运算规则与逻辑运算符的规则类似。运算符的运算规则与
41、逻辑运算符的规则类似。 (按位异或)可看作按位加,不产生进位。(按位异或)可看作按位加,不产生进位。3 3 优先级别优先级别: 优先级别最高,其余优先级别最高,其余3 3个优先级别依次为个优先级别依次为 & & 高于高于 高于高于 | | 但但3 3个都高于逻辑运算符,低于关系运算符。个都高于逻辑运算符,低于关系运算符。术私寥淋曼犀沉应旱愉佳淫棱衅颂妻蛆猫离廷榔润赌氛硅秧缔旬辩渔去铸三章运算符和表达式三章运算符和表达式例:如果例:如果m m为为0x137f0x137f,n n为为0xf7310xf731,则,则m m和和n n在在1616位计算机内的二进制表示形式如下:位计算机内的二进制表示形
42、式如下: m m 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 n n 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1_ m&n= 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1=0x1331m&n= 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1=0x1331 m|n= 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1=0xf77f m|n= 1 1 1 1 0 1 1 1 0 1 1
43、1 1 1 1 1=0xf77f mn= 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 0=0xe44emn= 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 0=0xe44e m= 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0=0xec80 m= 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0=0xec80如果是如果是3232位机,位机,mm的结果是不同的,请同学们考虑应当是多少?的结果是不同的,请同学们考虑应当是多少?位运算符位运算符-位逻辑运算符位逻辑运算符4 与逻辑运算符区别:与逻辑运算符区别:位逻辑运算符是针对二进制位,而逻
44、辑运算符是针对整个表达式。位逻辑运算符是针对二进制位,而逻辑运算符是针对整个表达式。位逻辑表达式计算出来的结果有具体数值,而逻辑表达式结果只有位逻辑表达式计算出来的结果有具体数值,而逻辑表达式结果只有“真真”和和“假假”两个取值。两个取值。位逻辑运算符位逻辑运算符&、|和和的两个运算分量是可以交换的,但逻辑运算符的两个运算分量是可以交换的,但逻辑运算符&和和|的运的运算分量是不能交换的。算分量是不能交换的。例:例: 4&6 结果为结果为 4 4&6 结果为结果为 1 4|6 结果为结果为 6 4|6 结果为结果为 1 4&8 结果为结果为 0 4&8 结果为结果为 1 4|8 结果为结果为 1
45、2 4|8 结果为结果为 1阿善迪响辑巩烛粉猩兄佑挞朵借释腑技铜撒全咱率群怠逆女走油稼谷叮殿三章运算符和表达式三章运算符和表达式使特定位翻转使特定位翻转例如,例如, 假设变量假设变量a的取值为的取值为0x7a,则表达式,则表达式a017的结果的低的结果的低4位和变位和变量量a的低的低4位正好相反。位正好相反。 017 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1a 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0_a017= 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1与与0异或,结果保持原值不变异或,结果保持原值不变使用下面使用下面3个语句可
46、交换两个变量取值个语句可交换两个变量取值a=ab;b=ba;a=ab;ba=b(ab)=bab=abb=aab=aba=aab=b位运算符位运算符-位逻辑运算符位逻辑运算符垣堰单棒锈珊澈吏抢滚乍第拦旋什瞩萝畔撂姨誊浇操郡嘎杨戏茵状贵工杠三章运算符和表达式三章运算符和表达式位运算符位运算符-位逻辑运算符位逻辑运算符5、 位逻辑运算符特殊用法:位逻辑运算符特殊用法:&取某个数的指定位(保留指定位)取某个数的指定位(保留指定位)例如,例如, 0377表示成二进制为表示成二进制为 0 000 000 011 111 111那么表达式那么表达式a&0377 结果为变量结果为变量a的低的低8位。(也可看成
47、位。(也可看成a的的高高8位清位清0)。)。指定位清指定位清0|将某个数指定位置将某个数指定位置1例如,例如,017表示成二进制为表示成二进制为 0 000 000 000 001 111那么表达式那么表达式a|017结果为变量结果为变量a的低的低4位置位置1,其余为不变。,其余为不变。零轿售夹会葫调沉读痪支赖及皮篆恫黍僚赶叭吕花穆又昭奴淤致滑断不寞三章运算符和表达式三章运算符和表达式例,将例,将int型变量型变量a的最低位清的最低位清0 在在16位机器中,可用表达式位机器中,可用表达式 a&0177776 在在32位机器中,要用表达式位机器中,要用表达式 a&037777777776 可见采
48、用以上做法可移植性差,采用可见采用以上做法可移植性差,采用运算符进行改进,可采运算符进行改进,可采用以下表达式用以下表达式 a&1 理由:理由: 1在在16位机中结果为位机中结果为1111 1111 1111 1110=0177776 1在在32位机中结果为位机中结果为1111 1111 1111 1111 1111 1111 1111 1110= 037777777776 类似表达式如类似表达式如 a&077 结果为将变量结果为将变量a的低的低6位清位清0位运算符位运算符-位逻辑运算符位逻辑运算符顽惺亡连玛肪皖祈谊辖江炊吾牡羹贯棱平销技凿峻舱串噬笆瑚毁芍甩慷油三章运算符和表达式三章运算符和表
49、达式位运算符位运算符-移位运算符移位运算符1 组成:组成: 左移左移 右移右移 要求参与运算的两个运算分量是整型数据要求参与运算的两个运算分量是整型数据2 使用形式:使用形式:表达式表达式1表达式表达式23 运算规则:运算规则: 将将“表达式表达式1”的值(二进制形式)向左移动的值(二进制形式)向左移动“表达式表达式2”取值所表示的取值所表示的位数。位数。移出去的高位被舍弃,而右边低位补移出去的高位被舍弃,而右边低位补0。 例如,例如,a=10,表示成二进制数为表示成二进制数为00001010,那么,那么 a 0 0 0 0 1 0 1 0 a运算规则:运算规则: 将将“表达式表达式1”的值(
50、二进制形式)向右移动的值(二进制形式)向右移动“表达式表达式2”取值所表示的取值所表示的位数。位数。移出去的低位被舍弃。移出去的低位被舍弃。例如,例如,a=10,表示成二进制数为表示成二进制数为00001010,那么,那么 a 0 0 0 0 1 0 1 0 a2的结果为的结果为 0 0 0 0 0 0 1 0 = 2 右移一位表示除以右移一位表示除以2,右移,右移n位相当于被移对象除以位相当于被移对象除以2n.l 在右移时,要注意的是对于在右移时,要注意的是对于无符号数,右移后左边高位补无符号数,右移后左边高位补0 0。这种移这种移位方式称为位方式称为“逻辑移位逻辑移位”。l 对于有符号数,
51、如果移位对象是正数,左边高位补对于有符号数,如果移位对象是正数,左边高位补0 0;如果移位对象;如果移位对象是负数,则左边高位补是负数,则左边高位补1 1(即与补符号位相同的数),这种移位方式称(即与补符号位相同的数),这种移位方式称为为“算术移位算术移位”。l 注意,有些系统采用逻辑移位方式,而另外一些系统采用算术移位注意,有些系统采用逻辑移位方式,而另外一些系统采用算术移位方式。方式。Turbo CTurbo C采用算术移位。采用算术移位。位运算符位运算符-移位运算符移位运算符氢畜售畔卯狂燕昼蛋央熙颁裤墓霖雄面凤寅验铸乓梯阅馏度诊箩栓名春蝉三章运算符和表达式三章运算符和表达式3 运算规则:
52、运算规则:例如,例如,a=0113755a=0113755,则,则 a 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 a 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 如果系统采用逻辑移位,则如果系统采用逻辑移位,则 a1 a1的结果为的结果为 0 0 1 0 0 1 0 1 1 1 1 1 1 0 1 1 01 0 0 1 0 1 1 1 1 1 1 0 1 1 0 如果系统采用算术移位,则如果系统采用算术移位,则 a1 a1的结果为的结果为 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0
53、 1 1 0 请同学们在使用右移运算符时注意留意你所使用的系统处理的方法。请同学们在使用右移运算符时注意留意你所使用的系统处理的方法。优先级别:优先级别:移位运算符的优先级别低于算术运算符,高于关系运算符移位运算符的优先级别低于算术运算符,高于关系运算符。位运算符位运算符-移位运算符移位运算符艰京铆硬涧殃鞠卒檄阎疗宿幌堕买梳哲耕活蛹坐丑班急冲洱廖瞒炽小撰烫三章运算符和表达式三章运算符和表达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结合性优先级别和结合性C运算符分类运算符分类运算符运算规则运算符运算规则 逗号运算符逗号运算符喇女异商埋槛狱悉母恩社涅忱边印烂淋拢靴松茨
54、郊谨功烛孤婴具韶庇吸铺三章运算符和表达式三章运算符和表达式逗号运算符逗号运算符表达式表达式1 1,表达式,表达式2 2表达式表达式1 1,表达式,表达式2 2,表达式,表达式3 3,表达式,表达式n n含义:用于分隔各个表达式,最后一个表达式的值代表整个表达式的值含义:用于分隔各个表达式,最后一个表达式的值代表整个表达式的值如:如:a=1,a+2a=1,a+2 a=3,a+3,a+10,a=a+20,a+1 a=3,a+3,a+10,a=a+20,a+1从左至右依次计算各个表达式的的值,最后一个表达式的值即从左至右依次计算各个表达式的的值,最后一个表达式的值即为整个表达式的值。为整个表达式的值
55、。 例:例:1 1)a=3*5,a*4 a=3*5,a*4 结果为结果为6060 2 2)(a=3*5,a*4),a+5 (a=3*5,a*4),a+5 结果为结果为20 20 “顺序求值运算符顺序求值运算符”六煤溺诽其瞎赖缺除耍违缕混扛桩石恤哑咙贫碎媳供呵醉陵挥似篓走靳虑三章运算符和表达式三章运算符和表达式逗号运算符逗号运算符使用要点使用要点优先级在所有运算符中为最低。优先级在所有运算符中为最低。 如:如: x=(a=3,6*a) 结果为结果为 x=18 x=a=3,6*a 结果为结果为 18 (x=3)并非任何地方出现的并非任何地方出现的“,”都是作为运算符使用的。都是作为运算符使用的。如
56、:如: printf(“%d,%d,%d”,a,b,c); 即函数参数间的即函数参数间的“,”只作为分隔符。只作为分隔符。蜡益唬蔓挂鞘茧寿饵隋锑顾痘幼绑捡很吗沿应撼亡樱然贝选窿五云啤吊置三章运算符和表达式三章运算符和表达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结合性优先级别和结合性C运算符分类运算符分类运算符运算规则运算符运算规则 其他运算符其他运算符陛卵敬同镣峻航侗琵涵挑庸匪月嘴渔寂蒂社标淳眷封当皂睹死睡纬槛慌底三章运算符和表达式三章运算符和表达式其他运算符其他运算符1& 取地址运算符(单目)取地址运算符(单目)* 间接访问运算符(单目)间接访问运算符(单目)
57、例如例如 int a,*p; p=&a;把变量把变量a在内存单元中的地址赋给指针变量在内存单元中的地址赋给指针变量p。例如,例如, scanf(“%d”,&a);2强制类型运算符强制类型运算符使用形式使用形式 (类型名)表达式(类型名)表达式例如,假设变量例如,假设变量a为为int类型,表达式(类型,表达式(double)a 的结果为的结果为double 类型的。(注类型的。(注意并没有改变变量意并没有改变变量a的类型)的类型)告夺检呜耻孪绽骗速澎簿梁溢杖棒月好睡吟址练造墓献咽加井荐减兄伊谴三章运算符和表达式三章运算符和表达式其他运算符其他运算符3 sizeof3 sizeof()()用于计算
58、变量或者某种类型的数据在计算机内部表示所占用的字节数。用于计算变量或者某种类型的数据在计算机内部表示所占用的字节数。例如,例如, sizeof(int) sizeof(int)在字长在字长1616位的机器中,该表达式结果为位的机器中,该表达式结果为2 2。在字长为。在字长为3232位的机器中,该位的机器中,该表达式的结果为表达式的结果为4 4。4 4基本运算符基本运算符 ( ) ( ) 括号括号 下标运算符下标运算符 - - 指向运算符指向运算符 . . 成员运算符成员运算符 以上以上4 4个运算符优先级别是所有运算符中最高的。个运算符优先级别是所有运算符中最高的。勤蓑墩烹瘴捌脓蚕兼涟搜昌它咽
59、镰面蛾缸盎懊郝莱冀肉搭仍正缨赔烦泰卷三章运算符和表达式三章运算符和表达式本讲重点本讲重点本讲重点本讲重点运算符运算规则运算符运算规则优先级别和结合性优先级别和结合性C运算符分类运算符分类运算符运算规则运算符运算规则坠硅严茫通永瞅逝井假您喜赢本挫刹鬃弗柴衍阶序吃纵标阎伍护盲毅掳曾三章运算符和表达式三章运算符和表达式各种各种运算符的结合性运算符的结合性单目运算符、条件运算符、赋值运算符的结合性是单目运算符、条件运算符、赋值运算符的结合性是从右到左。其余运算符的结合性均为从左到右。从右到左。其余运算符的结合性均为从左到右。太棺汕昏杉卷寇乌致侵颇转碴漾磁惊抒城按帐墩渊舷泥党刃巍闪串鸟瓶矢三章运算符和表达式三章运算符和表达式各种各种运算符的优先级运算符的优先级 基本运算符基本运算符 高高 单目运算符单目运算符 算术运算符(先乘除,后加减)算术运算符(先乘除,后加减) 移位运算符移位运算符 关系运算符关系运算符 逻辑运算符(!除外)逻辑运算符(!除外) 条件运算符条件运算符 赋值运算符赋值运算符 低低 逗号运算符逗号运算符怨多爬辱喇馈脉颊罕婿向睫叉或栓语赞兑斤奠丘驰禽掖漾悄逆娄障褥辨擦三章运算符和表达式三章运算符和表达式THE END臂款涅囊浆梦措坟忻通豢柑厂课兽尚哭噎桌九幸碱灌浚傲甫裤摄励蜕皮裔三章运算符和表达式三章运算符和表达式