《C语言基本运算符与表达式.ppt》由会员分享,可在线阅读,更多相关《C语言基本运算符与表达式.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 基本运算符和表达式基本运算符和表达式表达式表达式算术运算符和表达式算术运算符和表达式赋值运算符赋值运算符不同数据类型间的转换不同数据类型间的转换关系运算符和表达式关系运算符和表达式逻辑运算符和表达式逻辑运算符和表达式自增和自减运算符自增和自减运算符逗号运算符和表达式逗号运算符和表达式条件运算符和表达式条件运算符和表达式求字节运算符求字节运算符 学习重点学习重点1.熟悉几种常用的运算符熟悉几种常用的运算符2.掌握运算符的运算规则掌握运算符的运算规则3.掌握表达式求值掌握表达式求值 3.1 表达式表达式一、一、表达式的概念表达式的概念 表达式是由运算符连接常量、变量、函表达式是由运算符连接常量、
2、变量、函数所组成的式子。数所组成的式子。每个表达式都有一个值每个表达式都有一个值和类型。和类型。二、二、运算符的种类:运算符的种类:据运算对象的个数分有三种:据运算对象的个数分有三种:单目、双目、三目单目、双目、三目C运运算算符符算术运算符:(算术运算符:(+-*/%+-+-*/%+-)关系运算符:(关系运算符:(=!=!=)逻辑运算符:(!逻辑运算符:(!&|&|)位运算符位运算符 :(:(|&|&)赋值运算符:(赋值运算符:(=及其扩展)及其扩展)条件运算符:(条件运算符:(?:?:)逗号运算符:(逗号运算符:(,)指针运算符:(指针运算符:(*&)求字节数求字节数 :(:(sizeofs
3、izeof)强制类型转换:(类型)强制类型转换:(类型)分量运算符:(分量运算符:(.-.-)下标运算符:(下标运算符:()其它其它 :(:(()-()-)学习运算符应注意:学习运算符应注意:运算符功能运算符功能与运算量关系与运算量关系要求运算量个数要求运算量个数要求运算量类型要求运算量类型运算符优先级别运算符优先级别结合方向结合方向结果的类型结果的类型一、算术运算符:一、算术运算符:+-*/%*/%结合方向:从左向右结合方向:从左向右优先级:优先级:-*/%*/%-+-+-说明:说明:“-”可为可为单目单目运算符时运算符时,右结合性右结合性两整数相除,结果为整数两整数相除,结果为整数%要求两
4、侧均为整型数据要求两侧均为整型数据例例 5/2 =-5/2.0 =例例 5%2 =-5%2 =1%10 =5%1 =5.5%2例例 5/2 =2 -5/2.0=-2.5例例 5%2 =1 -5%2 =-1 1%10 =1 5%1 =0 5.5%2 ()3.2 算术运算符和表达式算术运算符和表达式例例1:#include”stdio.h”main()printf(nn%d,%dn,20/7,-20/7);printf(%f,%fn,20.0/7,-20.0/7);结果:结果:2,-22.857143,-2.857143例例2:#include”stdio.h”main()printf(%dn,1
5、00%3);结果:结果:13.33.3 赋值运算符赋值运算符一、简单赋值运算符:一、简单赋值运算符:=格式:格式:变量变量=表达式表达式作用:将一个数据(常量或表达式)赋给一个变量作用:将一个数据(常量或表达式)赋给一个变量 二、复合赋值运算符二、复合赋值运算符种类种类:+=-=*=/=%=a+=3a=a+3x*=y+8x=x*(y+8)例例 a=3;a=3;d=func();d=func();c=d+2;c=d+2;a+=ba=a+ba-=ba=a-ba*=ba=a*ba/=ba=a/ba%=ba=a%b说明说明:结合方向:结合方向:自右向左自右向左左侧必须是变量,不能是常量或表达式左侧必须
6、是变量,不能是常量或表达式优先级:比算术低优先级:比算术低例例 3=x-2*y;3=x-2*y;a+b=3;a+b=3;例例:a=b=c=5:a=b=c=5 a=(b=5)a=(b=5)a=5+(c=6)a=5+(c=6)a=(b=4)+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2)a=(b=10)/(c=2)/表达式值为表达式值为5 5,a,b,ca,b,c值为值为5 5/b=5;a=5/b=5;a=5/表达式值表达式值1111,c=6,a=11c=6,a=11/表达式值表达式值1010,a=10,b=4,c=6a=10,b=4,c=6/表达式值表达式值5 5,a=5,b=
7、10,c=2a=5,b=10,c=2例例:a=12;a=12;a+=a-=a*a;a+=a-=a*a;/a=-264/a=-264 等价于等价于a=a+(a=a-(a*a)a=a+(a=a-(a*a)例例:int a=2;:int a=2;a%=4-1;a%=4-1;a+=a*=a-=a*=3;a+=a*=a-=a*=3;/a=0/a=0 等价于等价于a=a+(a=a*(a=a-(a=a*3)a=a+(a=a*(a=a-(a=a*3)例例3:#include”stdio.h”main()int a,b,c,d,x,y,z;a=100;b=45;c=-19;d=94;x=-2;y=5;z=28;
8、a+=6;b-=x;c*=10;d/=x+y;z%=8;printf(n%6d%6d%6d%6d%6d n,a,b,c,d,z);结果:结果:106 47 -190 31 43.4 不同类型数据间的转换不同类型数据间的转换转换有两种:转换有两种:隐式:计算机自动进行的转换隐式:计算机自动进行的转换显式:强制性转换显式:强制性转换一、隐式转换(一、隐式转换(4 4种)种)v运算转换运算转换-不同类型数据混合运算时不同类型数据混合运算时v赋值转换赋值转换-把一个值赋给与其类型不同的变量时把一个值赋给与其类型不同的变量时v输出转换输出转换-输出时转换成指定的输出格式输出时转换成指定的输出格式v函数调
9、用转换函数调用转换-实参与形参类型不一致时转换实参与形参类型不一致时转换(1)运算转换运算转换:不同类型数据运算时先不同类型数据运算时先自动自动转换成同一类型转换成同一类型数据类型的级别数据类型的级别floatlongintbitchar低低高高unsignedsigned转换规则:转换规则:当运算符两端的数据类型不同时,按当运算符两端的数据类型不同时,按“向高看向高看齐齐”的原则,对较低的类型提升。的原则,对较低的类型提升。10+a +i*f -d/l例例 int i;float d,f;long l;intintfloatfloatfloatfloatfloatfloat(2)赋值转换:)
10、赋值转换:自动将自动将“=”右边的类型转换右边的类型转换为左边变量的类型。为左边变量的类型。实实整,舍弃小数。整,舍弃小数。例:例:int i;i=375.986;i=375intfloat,数值不变,但以浮点形式存到变量中。数值不变,但以浮点形式存到变量中。例:例:float f;f=36;f=36.000000 字符字符 整型,将字符的整型,将字符的ASCII码值放到整型码值放到整型量的低八位中,高八位为量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符变量。整型赋予字符型,只把低八位赋予字符变量。例例4 4:#include”stdio.h”main()main()int a,
11、b=322,i;int a,b=322,i;float x,y=8.88;float x,y=8.88;char c1=k,c2;char c1=k,c2;a=y;x=b;a=y;x=b;i=c1;c2=b;i=c1;c2=b;printf(%d,%f,%d,%c,a,x,i,c2);printf(%d,%f,%d,%c,a,x,i,c2);signedunsigned,原样照赋原样照赋例例5#include”stdio.h”main()unsigned int a;int b=-1;a=b;printf(“%u”,a);输出结果:输出结果:65535C二、显式转换(强制转换)二、显式转换(强
12、制转换)格式:格式:(类型名类型名)(表达式)表达式)例例 (int)(x+y)(int)(x+y)(int)x+y (int)x+y (float)(3/2)(float)(3/2)(int)3.6 (int)3.6 说明:强制转换得到所需类型的中间变量,原说明:强制转换得到所需类型的中间变量,原变量类型不变变量类型不变 例例6#include”stdio.h”main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);结果:结果:x=3.600000,i=3精度损失问题精度损失问题较高类型向较低类型转换时可能发生较高类型向较低类型转
13、换时可能发生v例:例:float f;f=6/7;问:问:f=?f=0.8571 f=0.0 改为:改为:f=6.0/7 或或 f=6/7.0或或 f=(float)6/7v类型转换时,只赞成低类型转换时,只赞成低高高 不赞成高不赞成高低低 只赞成有符号数只赞成有符号数无符号数无符号数 不赞成无符号数不赞成无符号数有符号数有符号数3.5 关系运算符和表达式关系运算符和表达式l运算符:运算符:=!=l结合方向:自左向右结合方向:自左向右l优先级别:优先级别:=-=!=l与其它比:算术与其它比:算术关系关系赋值赋值例例 ca+b /c(a+b)ca+b /c(a+b)ab!=c /(ab)!=c
14、ab!=c /(ab)!=c a=bc /a=(bc)a=bc /a=(bc /a=(bc)a=bc /a=(bc)l关系表达式的值:是逻辑值,关系表达式的值:是逻辑值,1(真真)0(假假)例例 int a=3,b=2,c=1,d,f;ab (ab)=c b+cb f=abc/表达式值表达式值1/表达式值表达式值1/表达式值表达式值0/d=1/f=0注意:注意:例例 若若a=0;b=0.5;x=0.3;则则 a=x278在在C中是允许的,中是允许的,值为值为0例例 int i=1,j=7,a;a=i+(j%4!=0);则则a=2例例 a0 结果为结果为 A100 结果为结果为10例例 注意区分
15、注意区分“=”与与“=”int a=0,b=1;if(a=b)printf(“a equal to b”);else printf(“a not equal to b”);例例7:#include”stdio.h”main()int x,y,z;printf(“input data x,y:n”);scanf(“%d%d”,&x,&y);printf(“n x y xy xy x=y x!=y x=y”);printf(“n%5d%5d”,x,y);z=xy;printf(“%5d”,z);z=xy;printf(“%5d”,z);z=x=y;printf(“%5d”,z);z=x!=y;pr
16、intf(“%5d”,z);z=x=y;printf(“%5d”,z);printf(“n”);结果结果1:input data x,y:5 3 回车回车 x y xy xy x=y x!=y x=y 5 3 0 0 1 1 1 0结果结果2:-input data x,y:-5 -3 回车回车 x y xy xy x=y x!=y x=y -5 -3 1 1 0 0 1 0结果结果1:input data x,y:4 4 回车回车 x y xy xy x=y x!=y x=y 4 4 0 1 0 1 0 1ab!a!ba&ba|b真真假假真真假假假假假假真真真真3.6 逻辑运算符和表达式逻辑
17、运算符和表达式l运算符:运算符:!&|l逻辑运算真值表逻辑运算真值表 运算量运算量:0 0(假)(假)非非0 0(真)(真)表达式值表达式值:0 0(假)(假)1 1(真)(真)真假假假假假真真假假真真真假真真例例 a=x&xb&xy a=b|x=y !a|abl优先级:优先级:l结合方向:结合方向:!:右右左左&:左左右右|:左左右右/(a=x)&(xb)&(xy)/(a=b)|(x=y)/(!a)|(ab)l与其它比:单目与其它比:单目算术算术关系关系逻辑逻辑赋值赋值!&|例例 a=4;b=5;!a a&b a|b !a|b 4&0|2 53&2|8b)&(n=cd)求求 m=?n=?/m
18、=0,n=1例例 a&b&c /只在只在a为真时,才判别为真时,才判别b的值;的值;只在只在a、b都为真时,才判别都为真时,才判别 c的值的值v或表达式遇真结束或表达式遇真结束例例 a|b|c /只在只在a为假时,才判别为假时,才判别b的值;的值;只在只在a、b都为假时,才判别都为假时,才判别 c的值的值例例8:#include”stdio.h”main()int x,y,z;printf(“input data x,y:n”);scanf(“%d%d”,&x,&y);printf(“n x y !x x|y x&y”);printf(“n%5d%5d”,x,y);z=!x;printf(“%
19、8d”,z);z=x|y;printf(“%8d”,z);z=x&y;printf(“%8d”,z);printf(“n”);结果结果1:input data x,y:12 8 回车回车 x y !x x|y x&y 12 8 0 1 1 结果结果2:input data x,y:9 -3 回车回车 x y !x x|y x&y 9 -3 0 1 1 结果结果3:input data x,y:0 81 回车回车 x y !x x|y x&y 0 8 1 1 0 结果结果4:input data x,y:-23 0 回车回车 x y !x x|y x&y -23 0 0 1 10 结果结果5:i
20、nput data x,y:0 0 回车回车 x y !x x|y x&y 0 0 1 0 0 3.7 自增、自减运算符:自增、自减运算符:+-l作用:使变量值加作用:使变量值加1 1或减或减1 1 i+或或+i i=i+1 i-或或-i i=i-1l种类:种类:前缀:前缀:+i,-i 先增先增1 1(减减1 1),),再使用再使用i i值值后缀:后缀:i+,i-先使用先使用i i值值,再增再增1 1(减减1 1)例例 j=3;k=+j;j=3;k=+j;j=3;k=j+;j=3;k=j+;j=3;printf(j=3;printf(“%d%d”,+j);,+j);j=3;printf(j=3
21、;printf(“%d%d”,j+);,j+);a=3;b=5;c=(+a)*b;a=3;b=5;c=(+a)*b;a=3;b=5;c=(a+)*b;a=3;b=5;c=(a+)*b;/k=4,j=4/k=4,j=4/k=3,j=4/k=3,j=4/4/4/3/3/c=20,a=4/c=20,a=4/c=15,a=4/c=15,a=4l说明:说明:不能用于常量和表达式不能用于常量和表达式,如如5+5+,(a+ba+b)+)+结合方向:结合方向:自右向左自右向左优先级:优先级:-+-+-*/%-+-*/%-+-例例-i+i+-(i+)-(i+)i=3;printf(i=3;printf(“%d%
22、d”,-i+);,-i+);/-/-3 3 例例 int a=5,b;b=a+;printf(“a=%d,b=%d”,a,b);/a=6,b=5例例 int a=5,b;b=+a;printf(“a=%d,b=%d”,a,b);/a=6,b=6例例9:#include”stdio.h”main()int x,y,z;x=y=8;z=+x;printf(“n%3d%3d%3d”,y,z,x);x=y=8;z=x+;printf(“n%3d%3d%3d”,y,z,x);x=y=8;z=-x;printf(“n%3d%3d%3d”,y,z,x);x=y=8;z=x-;printf(“n%3d%3d%
23、3d”,y,z,x);printf(“n”);结果:结果:8 9 9 8 8 9 8 7 7 8 8 7 3.8 逗号运算符和表达式逗号运算符和表达式形式:形式:表达式表达式1,表达式表达式2,表达式表达式n结合性结合性:从左向右从左向右优先级优先级:最低最低表达式表达式值:等于表达式值:等于表达式n的值的值用途:用途:常用于循环常用于循环for语句中语句中例例 a=3*5,a*4 a=3*5,a*4,a+5例例 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);/a=15,表达式值表达式值60/a=15,表
24、达式值表达式值20/1,2,3/3,2,3例例10:#include”stdio.h”main()int x,y=7;float z=4;x=(y=y+6,y/z);printf(x=%dn,x);运行结果:运行结果:x=33.9 条件运算符与表达式条件运算符与表达式v e1?e2 :e3 (唯一的三目运算符)唯一的三目运算符)v功能:功能:e1为真,取为真,取e2值;值;e1为假,取为假,取e3值。值。(相当于条件语句,但不能取代一般(相当于条件语句,但不能取代一般if语句)语句)结合方向:结合方向:自右向左自右向左 如如 ab?a:cd?c:d ab?a:(cd?c:d)例例 if(ab)
25、printf(“%d”,a);else printf(“%d”,b);printf(“%d”,ab?a:b);例例 求求 a+|b|printf(“a+|b|=%dn”,b0?a+b:a-b);例例 (a=b)?Y:N (x%2=1)?1:0 (x=0)?x:-x (c=a&c=z)?c-a+A:c 3.10 3.10 求字节运算符求字节运算符 sizeof l单目运算符单目运算符l作用:返回变量或类型的字节长度。作用:返回变量或类型的字节长度。l一般形式为:一般形式为:sizeofsizeof(变量或类型变量或类型变量或类型变量或类型)如如:sizeof(double)为为8 sizeof(
26、int)为为2也可以求已定义的变量也可以求已定义的变量,例如例如:float f;int i;i=sizeof(f);则则i i的值将为的值将为4 4。例例11:#include”stdio.h”#include main()printf(“n char:%5d byte,sizeof(char);printf(“n int:%5d bytes,sizeof(int);printf(“n long:%5d byte,sizeof(long);printf(“n float:%5d byte,sizeof(float);运行结果:运行结果:char 1 byteInt 2 byteslong 4 bytesfloat 4 bytes