1、 第3章(续)1.运算符和表达式2.算术运算符和算术表达式3.赋值运算符和赋值表达式4.自增、自减运算符5.逗号运算符和逗号表达式6.不同类型数据间的混合运算7.课后作业本讲主要内容:C 运算符1 运算符和表达式表达式是常量、变量、数组元素、函数等运算对象和运算符以及括号的有意义组合类似数学算式或公式,但写法有不同运算符的优先级和结合性见教材附录III算术运算符+-*/%指针运算符*&关系运算符 =!=求字节数运算符sizeof逻辑运算符!&|强制类型转换运算符 类型位运算符|&分量运算符-赋值运算符=下标运算符 条件运算符?:其它逗号运算符,2 算术运算符和算术表达式2.1、基本的算术运算符
2、+(加法运算符,或正值运算符):如 2+3、+6-(减法运算符,或负值运算符):如 3-4、-6*(乘法运算符):如 3*4/(除法运算符):两个整数相除,其值为整数,如 5/3值为1除数、被除数中有一个为负值时,结果向零取整,如-5/3为-1除数、被除数中有一个为实数时,结果为 double 型-7%4,7%-4,-7%-4的值为多少?%(模(求余)运算符):%两侧均为整型数据如 7%4 的值为 3(-3,3,-3)2.2、算术表达式和运算符的优先级与结合型1)用算术运算符和括号将运算对象(操作数)连接起来的、符合 C 语言语法规则的式子,称作算术表达式。如:-123 a+b 10*(alp
3、ha+1.5)*sin(beta)2)运算符有优先级和结合性优先级:算术运算符先*、/、%后+、-结合型:左结合,即表达式从左向右进行计算如:a+b/(c+d%e)-3.3+4*3 3.3、类型转换与强制类型转换可以利用强制类型转换运算符将一个表达式转换成所需类型。如:(double)a(int)(x+y)与(int)x+y不同(float)(8%5)例3.7void main()float x;int i;x=3.6;i=(int)x+2;printf(%f,%dn,x,i);同一运算符相连的运算数的数据类型自动从短类型向长类型转化,如上例3.1.赋值运算符“=”3.赋值运算符和赋值表达式用
4、法:变量=表达式作用:将表达式的值赋给变量(构成赋值表达式)如:a=5;5 =a ave=(a+b)/2;先计算(a+b)/2,结果赋给 ave x=y=z;首先 z=y,然后(y=z)=x与数学上的等式不同!5=x;x+1=y*a+3;都是非法的 C 语句说明1:在 C 语言中判断是否相等用关系运算(=)。说明2:运算结果 赋值表达式的值等于左边变量的值!3)整型数据赋给实型变量时,数值不变,但以浮点数形式存储到变量中。3.2、赋值结果与类型转换2)实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。如:设 i 为整型变量,执行 i=5.34 i 的值为 5如:对 float 型变
5、量 f,执行 f=23 f 的值为 23.000001)如果两边的类型一致,就直接赋值;否则需要进行类型转换。例3.9 main()int i;float f;i=5.34;f=23;printf(“i=%d,f=%fn,i,f);上机演示4)无符号整型与有符号整型例3.10void main()unsigned a;int b=-1;a=b;printf(%d -%un,b,a);a=65534u;b=a;printf(%d -%un,b,a);1 11 11 11 11 11 11 11 1b11 11 11 11 11 11 11 11 a 0 0 1 0 1 0 1 1 0 0 1 0
6、 1 0 1 1 0 0 0 0 0 0 0 0 i 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1i5)char、int、long等类型的转换“短”数据赋给“长”变量保持数值不变符号扩展:若最高位为 1(负数),则变量高字节位补 1;反之,补 0。例3.12void main()int i;long l=6324232L;i=l;printf(i=%dn,i);“长”数据赋给“短”变量截断:只将数据的低字节位原封不动送到变量中 0 00 00 00 00 00 10 00 1i=-3276010 00 00 00 00 00 10 00 0 0
7、 00 00 00 01 10 00 00 l=6324232程序编译时有警告错3.3.复合的赋值运算符例如:a+=3等价于 a=a+3x*=y+8等价于 x=x*(y+8)注意有括号x%=3等价于 x=x%3算术运算:+=,-=,*=,/=,%=位运算:=,&=,=,|=说明:位运算在12章中介绍。赋值运算符与其他运算符的组合构成复合的运算符4、自增、自减运算符+i,-i 在使用 i 之前,先使 i 的值加 1 或减 1i+,i-在使用 i 之后,使 i 的值加 1 或减 1注意:(1)自增、自减运算符只能用于变量,而不能用于常量或表达式如:5+(a+b)+不合法如:-i+相当于-(i+)(
8、2)+和-的优先级高于算术运算符,结合方向是“自右相左”请自学教材5759页内容例1void main()int i=0,j;j=i+;printf(%d%dn,i,j);i=0;j=+i;printf(%d%dn,i,j);例2 讲解演示习题3.105.逗号运算符和逗号表达式形式:表达式1,表达式2作用:用于连接表达式计算过程:先求解表达式1,在求解表达式2。整个逗号表达式的值是表达式2的值。如:3+5,6+8 例:以下两个表达式的含义是不同的。x=(a=3,6*3)x=a=3,6*a*逗号表达式可组合 *逗号运算符的优先级最低,结合方向自右到左说明:并不是任何地方出现的逗号都是逗号运算符如
9、:printf(%d,%d,%dn,a,b,c);如:(a=3*5,a*4),a+56 不同类型数据间的混合运算整型、实型、字符型数据可以混合运算运算时,不同类型的数据要先转换成同一类型如:10+a+12.3-3.14x123floatdoublelongunsignedintchar,shortfloat 型先转换成 double 型char 和 short 型先转换成 int 型不同类型数据按照类型级别由低到高的顺序转换低高转换规则例:设k=2为int型变量,f1.2为float型,d=4.0为double型。考虑如下式子的运算10+a+k*f d/k解:原式=107+2.4+2.0=109.4+2.0=111.4最后类型为double型。例:习题3.9(1)x+a%3*(int)(x+y)%2/4(x=2.5,a=7,y=4.7)(2)原式=2.5+7%3*(int)(x+y)%2/4(3)=2.5+1*7%2/4=2.5+=2.5(4)(2)(float)(a+b)/2+(int)x%(int)y (a=2,b=3,x=3.5,y=2.5)(5)原式?