《2019年三章运算符和表达式ppt课件》由会员分享,可在线阅读,更多相关《2019年三章运算符和表达式ppt课件(56页珍藏版)》请在金锄头文库上搜索。
1、第三章 运算符和表达式,武汉大学计算机学院,主讲:谭成予 nadinetan163,教 材: C程序设计导论,本讲重点,运算符及表达式简介,表达式:由动词(运算符和函数调用)和名词(变量和常量)组成的一个完整的句子,说明了动词是如何运用到名词上产生一个结果。 运算符:完成特定运算功能的符号。 C语言运算符的类型: 算术运算符 赋值运算符 关系运算符 逻辑运算符 条件运算符 位运算符 逗号运算符 其他运算符 运算符的优先级与结合性,本讲重点,算术运算符,+ - * / %(求余) + +(自增) - -(自减),使用要点: 1)两个整型数相除,其结果为整型; 如:10/3=3 -5/3=-1 (
2、负数采用“向零取整”) 2)%运算符的两个操作数必须是整型; 如:7%4=3 特别情况: 0%5=0;5%0=5; -7%4=-3;-7%-4=-3; 7%-4=3。 即: %运算的符号只取决于第一个运算数的符号。,算术运算符,双目运算符:如 +、-、*、/和%; 单目运算符:如 “+”和“-”还可分别作为取正值、负值运算符。 单目运算符“+”和“-”优先级别高于双目运算符+、-、*、/和%; 双目运算符的优先级别:先乘除(*、/或%),后加减(+或-),算术运算符,x=30 x=24 x=11 x=1 x=0 x=1 y=25.0000,/*L3-1.C:算术运算符示例*/ #include
3、 int main(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; ,自增、自减运算符,+ + 自增运算符,表示加1运
4、算 - - 自减运算符,表示减1运算,前缀形式:在计算时先改变变量的值,再参与其它运算. + +i - -i 例:若 i=1, 则 k=+ +i +2 运行后 i=2、k=4,后缀形式:在计算时先参与其它运算,再改变变量的值. i+ + i- - 例:若 i=1, 而 k=i+ + +2 运行后 i=2、k=3,+ +与- -运算符的使用规则: + +与- -运算只能用于有左值的表达式,而不能用于常量或一般的表达式。 如:5+ +或(a+b)+ +为不合法的。 +与-运算符的的结合性为右结合性。,自增、自减运算符,/*L3-2.C:自增、自减运算符举例*/ #include int main(
5、) short 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 (2)a=10*b=9,自增、自减运算符,正确使用自增、自减运算符,对i+ + +j 表达式的处理:采用“自左至右”的原则 即: i+ + +j 与(i+ +)+j 等价 而不是与i+(+ +j )等价,对于代码int i = 3; i = i+; 不同编译器给出不同的结果, 有的为3, 有的为4, 哪个是正确的? 为什么这样的代码: ai = i+;
6、 不能工作?,对于代码int i = 3; i = i+; 不同编译器给出不同的结果, 有的为3, 有的为4, 哪个是正确的? 答: 没有正确答案; 这个表达式无定义。注意, i+ 和+i 都不同于i+1。如果你要使i 自增1, 使用i=i+1, i+=1, i+ 或+i, 而不是任何组合.,正确使用自增、自减运算符,如: 若i=3,则表达式(i+ +)+(i+ +)+(i+ +)的结果应为多少? 有的系统从左到右顺序完成括号中的运算,即表达式经过为3+4+5=12。 另外一些系统(如Turbo C、MS C)则先计算表达式的值,再自加3次i,即表达式结果为3+3+3=9。,正确使用自增、自减
7、运算符,对printf(“%d,%d”, i,i+ +);的理解若 i=3 ,则在Turbo C中对输出函数参数的求值顺序采用“自右至左”结果为:4,3(而不是3,3),不要滥用增量运算符; 增量运算符有副作用,会改变运算分量的值 但是如果使用不当,会带来意想不到的结果.,正确使用自增、自减运算符,对于代码int i = 3; i = i+; 不同编译器给出不同的结果, 有的为3, 有的为4, 哪个是正确的? 为什么这样的代码: ai = i+; 不能工作?,为什么这样的代码: ai = i+; 不能工作? 答: 子表达式i+ 有一个副作用 它会改变i 的值 由于i 在同一表达式的其它地方被引
8、用, 这会导致无定义的结果, 无从判断该引用(左边的ai 中)是旧值还是新值。,正确使用自增、自减运算符,本讲重点,赋值运算符,变量=表达式,含义:将“=”右边的运算对象之值赋给左边的运算对象。 如:x=1; x=x+1;,使用要点: (1)赋值运算符左边的量(称为左值)一般是变量。 (2)当“=”两边数据类型不同时,将进行数据类型的自动转换,原则是:以“=”左边运算对象的数据类型为准。 如: int x; float y=3.5; x=y; 则运行结果为int型,赋值表达式,求解过程: 赋值运算符按照“右结合性”顺序运算,将“=”右边表达式的值赋值给左边的变量。,表达式值为3,a,b,c值均
9、为3 表达式值为7,a值为7,c为2 表达式值为10,a=10,b=4,c=6 表达式值为5,a=5,b=10,c=2 若a=12,(1)则a-=a*a 后,a=-132,(2)a+=-132后,a=-264,使用举例: a=b=c=3 a=5+(c=2) a=(b=4)+(c=6) a=(b=10)/(c=2) a+=a-=a*a,赋值表达式,注意: (1)区分赋值语句和赋值表达式; (2)赋值表达式不仅可以出现在赋值语句中,也可以出现在其它语句中。 (3)赋值运算符的优先级别今比逗号运算符级别高,低于其他运算符。 (4)赋值表达式的值等于右边表达式的值。,赋值运算时不同类型数据间的自动转换
10、,1、实型数据赋值给整型数据时,舍弃小数部分; 即:int=float的结果为int型。 如:float a; int s; a=12.34; s=a; 这时s的值为12。 2、将整型数据赋值给实型变量时,数值不变,但数据是浮点形式的; 即float=int的结果为float型。如:int s; float a; s=12; a=s; 这时a的值为12.00000。,赋值运算时不同类型数据间的自动转换,3、当字符数据赋值给整型变量时,则将字符数据放到整型变量的低8位中,高8位数根据的存放数据有两种情况: 即: int=char 当char为无符号或unsigned char时,高8位应补0;
11、如:unsigned char c; int x; c=376;(八进制数376) 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 0,1 1 1 1 1 1 1 0,0 0 0 0 0 0 0 0,1 1 1 1 1 1 1 1,1 1 1 1 1 1 1 0,1 1 1 1 1 1 1 0,赋值运算时不同类型数据间的自动转换,4、将带符号的整型数据赋值给长整型数据时,要进行符号扩展。如果
12、int型数据为正值,则long int 型数据的高16位补0;如果int型数据为负值,则long int 型数据的高16位补1,以保持其原有数据不变。 5、将 long int 型数据赋值给int型数据时,只将long int 型数据的低16位原封不动的送到int 型变量中去(截断)。 6、将unsigned int型数据赋值给long int型数据时,不存在符号扩展问题,只需将高位补0;将unsigned int型数据赋值给 int型数据时,有可能出现错误数据。 如: int a; unsigned b=65535; a=b; printf(“%dn”,a); 此时a的值为-1。,复合赋值运
13、算符,在赋值运算符“=”之前加上其它运算符构成的运算符。,表达式1 运算符=表达式2 等价于:表达式1=表达式1 运算符 (表达式2),a+=3 等价于 a=a+3 x*=3 等价于 x=x*3 x%=3 等价于 x=x%3 x/=y+3 等价于 x=x/(y+3),使用要点 凡是二元(二目)运算符,都可以与“=”组合成复合赋值符 如:+=,-=,*=,/=,%=,=,则表达式ab的值为“0”; 而ac的值为“1”; 表达式c=ab的值为“0”; 表达式a!=b+c的值为“1”。 C语言识别表达式是否成立的方法是:所有值为“0”的表达式表示“假”,所有值为“非零” 的表达式都表示“真”。 请区
14、别:x=1 与 x= =1 的不同。,关系表达式,/*L3-3.C:*/ #include int main(void) int a,b,c; a=b=c=10; a=b= c; printf(“a=%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=10 a=1,b=20,c=11 a=0,b=20,c=11,本讲重点,逻辑运算符,1、含义:逻辑运算符用于完成逻辑(布尔)运算。 2
15、、符号类型: printf(“Input your year:n”); scanf(“%d”, ,Input your year: 1944 1944 is a leap year.,本讲重点,条件运算符,表达式1?表达式2:表达式3,条件运算符的执行顺序 先求表达式1,若为真则求解表达式2,整个表达式的值为表达式2的值;若表达式1的值为假则求解表达式3,整个表达式的值为表达式3的值.,条件运算符的优先级别高于赋值运算符,但低于其他运算符。,条件表达式中表达式1的类型可以与表达式2和表达式3的类型不一致.表达式2与表达式3的类型也可以不一致.,条件运算符,/*L3-5.c: 条件运算符范例*/
16、 #include int main(void) float x=1.0; int a=2,b=3; x=(ab)?a:b; printf(“%.4f”,x); return 0; ,3.0000,条件表达式(ab)?a:b的值为整型数据,但x为实型数据,所以输出为实型数据.,条件运算符,/*L3-6.C:*/ #include int main(void) int a,b,c; a=b=c=1; a+=b; b+=c; c+=a; printf(“(1)%dn”,ab?a:b); printf(“(2)%dn”,ac?a-:c+); (a=b=c)?printf(“AA”):printf(“CC”); printf(“na=%d,b=%d,c=%dn”,a,b,c); return 0; ,(1)2 (2)3 CC a=2,b=2,