【教学课件】第03章运算符和表达式.ppt
第 3 章 运算符与表达式,3.1 基本运算符和表达式3.2 类型转换,3.1 基本运算符和表达式,3.1.1 C+运算符及表达式简介,完成对常量、变量作运算的符号称为运算符。把参与运算的对象称为操作数。操作数可以是常量和变量等。,各种运算符见表 2-4,一元运算符、二元运算符、三元运算符,3.1.2 算术运算符和算术表达式,基本算术运算符:,+-*/%,/整数运算时为整除,结果为整数。,%(模运算或称求余运算)必须为整型数据。例:7/3 结果?7.0/3 结果?7%3 结果?,22.3333331,由运算符和操作数构成表达式:如:a+b a*(c+d)a*c+d,3.1.3 运算优先级和结合性,优先级:,对于同一表达式中出现多个运算符,先算 哪一个。,结合性:,在两种运算优先级相同时,“自左向右”还是“自右向左”运算称为结合性。,如:算术运算符的优先级与结合性,优先级:,+-较低*/%较高,结合性:,自左向右,例:表达式:6/3*2“自左向右”或“自右向左”运算结果不同,3.1.4 关系运算符和关系表达式,“关系运算”实际上就是“比较运算”,关系运算符及其优先次序,=!=,小于小于等于大于大于等于恒等于不等于,关系运算符及其优先级说明,a=bc 等效于 a=(bc),ca+b 等效于 c(a+b),算术关系(和=)关系(=和!=),关系表达式,1.用关系运算符连接两个表达式,int a=1,b=2,c=3;则表达式 ab 的值为 0则表达式 ba+c 的值为 1,2.关系表达式的值(运算结果)是逻辑值:“真”或“假”1 表示真 0 表示假,关系运算符的结合性:自左向右,3.1.5 逻辑运算符和逻辑表达式,逻辑运算符及其优先级:,C+语言提供三种逻辑运算符:&逻辑“与”|逻辑“或”!逻辑“非”,单目运算符,即只有一个操作数。如!a,逻辑运算的意义:,a&b,当 a、b 均为真时,表达式的值才为真,a|b,当 a、b 均为假时,表达式的值才为假,!a,当 a 为假,!a 为真;反之,当 a 为真时,!a 的值为假,逻辑运算符的优先次序:,!(非)算术 关系&|,逻辑表达式:用逻辑运算符将表达式连结起来,(2)C+编译系统在给出逻辑运算结果时,以数值 1 代表“真”以数值 0 代表“假”,(1)运算时,在判断一个量是否为“真”时,以非0 代表“真”以0 代表“假”,例如:已知 a=4则!a 的值是 0 已知 a=0,b=5则 a&b 的值是 0则 a|b 的值是 1则!a&b 的值是 1,注意:,注意:在C+程序中,欲表示数学关系 0 x10,C+的逻辑表达式必须写成 0=x&x=10,而不能写成 0=x=10。,为什么?,3.1.6 位运算符和位运算表达式,位运算是对整型数据的运算(可以操作到位),符号位参与运算,主要用于系统程序设计。,位运算符共有6 种:它们是:按位与(&)按位或(|)按位异或()按位取反()左移(),举例:按位“与”例如:已知:char a=3,b=2,c;求:c=a,此时,可将a、b、c看成是一个字节长度的整型数。,其它位运算,自学。,3.1.7 自增、自减运算符和表达式,使变量的值加 1 或减 1 的运算,如:+i,-i,在使用 i 之前加或减 1,i+,i-,在使用 i 之后加或减 1,int i=3,j;j=+i;,运算后 i=?,j=?,int i=3,j;j=i+;,运算后 i=?,j=?,注意:,只能用于变量,不能用于常量和表达式,如:3+;(a+b)+;错误,i=4,j=4,i=4,j=3,3.1.8 赋值运算符和赋值表达式,1赋值运算符“=”是赋值运算符,赋值表达式格式:,求解过程:求出 的值,赋给,赋值表达式的值:为 的值,如:a=b+c,还可以是另一个赋值表达式,,如:a=b=5 a=5+(c=6)a=(b=4)+(c=6),如果 a 初值为 2,表达式结果?,结果为 7,如:a=3,3是最简单的表达式,i=i+1,它不同于“等于号”,注意优先级 与结合性,b=c=d=a+5,自右向左,表达式结果分别为:?5 11 10,2.复合赋值运算符,复合赋值运算符,x*=y+8,等价于 x=x*(y+8),x%=3,等价于 x=x%3,x/=9,简写为:a+=3,a=a+3,简写为:a-=b,a=a-b,同理:,赋值运算符 以及 复合赋值运算符的运算优先级比算术运算符优先级低,运算结合性为自右向左。,等价于 x=x/9,例:a+=a-=a*a,如果 a 初值为 2,表达式结果?a+=a-=a*a,结果 a 的值为-4表达式的结果也为-4,3.1.9 逗号运算符和逗号表达式,逗号运算符:,逗号表达式:,.,如:a=3*5,a*4,a+5,逗号运算符优先级最低,结合性:自左向右,求解过程:依次计算、.的值。,逗号表达式的值:为 的值,运算结束后:a 的值为 15 整个表达式的值为 20,a=3*5,a*4,x=(a=3,6*3),赋值表达式,x=a=3,6*3,逗号表达式,例:如下表达式,运算结束后 a=?x=?表达式=?,a=15,表达式=60,a=3,x=18,表达式=18,a=3,x=3,表达式=18,逗号表达式,3.1.10 sizeof()运算符和表达式,例 int i;double x;sizeof(int)sizeof(i),sizeof(double)sizeof(x),格式:sizeof(类型标识/变量名)功能:求某类型变量所占字节数,例:求&,3.1.11 逻辑表达式运算优化时的副作用,从左向右扫描,计算,当 为真时,继续计算 当 为假时,即能确定整个表达式的值为假,则停止计算,例:求|,从左向右扫描,计算,当 为假时,继续计算 当 为真时,即能确定整个表达式的值为真,则停止计算,课堂练习int x,y,z,w;输出结果?x=y=z=1;w=+x|+y,输出:2 1 1 1,3.2 类型转换3.2.1 赋值时的自动类型转换,如果赋值运算符两侧的类型不一致,则遵循以下几条原则进行类型转换后赋值。,1.整型变量实型数据,舍弃小数(无四舍五入)。,int i=3.96;i 为 3,2.实型变量整型数据,数值不变,有效数位增加。,float f=23;f 为 23.0,double d=23;d 为 23.0,3整型数据之间相互赋值,整型数据类型有:signed char unsigned charsigned short unsigned shortsigned int unsigned intsigned long unsigned long,各种类型的整型数占用的字节数是不同的,其二进制位数有长有短。它们之间相互赋值,其实就是它们内存数据之间的赋值,分两种情况。,下面以 int 型数据与 char 型数据之间的赋值进行说明:,将 int 型变量赋给字符型变量时(长短)方法:截取低位赋值,例:signed char c1=250;,c1真值为-6,将字符型变量赋给 int 型变量时(短长),又分成两种情况:,有符号的字符型数据整型变量 需符号位扩展,例:char c1=15;int i;i=c1;,扩展正号,结果i 的真值为 15,char c1=250;int i;i=c1;,扩展负号,结果 i 的真值为-6,无符号的字符型数据整型变量 前面补 0 unsigned char c1=250;int i;i=c1;,前面补0,结果 i 的真值为 250,3.2.2 各种类型运算量混合运算时的自动类型转换,C 语言的数值型数据(常量变量)包括:,整型,int,short int,long int,unsigned int,unsigned short,unsigned long,实型,float,double,字符型,char,unsigned char,各种数据类型,它们的常量和变量之间可以混合运算。两个量运算时,在计算机内部首先将它们转换成相同数据类型的量,然后进行运算。虽然这种转换是C+内部自动完成的,但是若编程者知道了转换机理,对掌握及灵活运用C+表达式是有帮助的。转换原则如图2-3所示:,int i;float f;double d;10+a+i*f-d/i,int,double,double,double,double,例:,3.2.3 强制类型转换,形式:类型名(表达式)或:(类型名)表达式,例:int i,a;float x,y;double z;a=(int)(x+y);或 a=int(x+y);z=(double)a;或 z=double(a);a=(int)z%i;或 a=int(z)%i;,注意:1.强制转换的对象:表达式。2.强制转换并不将变量本身类型转变。,小结:类型转换有两种:(1)自动转换(赋值时,混合运算时)(2)强制转换,课堂练习:,求下面算术表达式的值:(1)已知 x=3.2,a=7,y=4.7 求 x+a%3*(int)(x+y)%2/4 的值(2)已知 a=2,b=3,x=3.5,y=3.2 求 float(a+b)/2+int(x)%int(y)的值,3.23.5,第 3 章 结束,