《第3讲运算符和表达式优秀课件.ppt》由会员分享,可在线阅读,更多相关《第3讲运算符和表达式优秀课件.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3讲运算符和表达讲运算符和表达式式第1页,本讲稿共25页运算符运算符:狭义的运算符是表示各种运算的符号。表达式表达式:使用运算符将常量、变量、函数连接起来,构成表达式。C语言运算符丰富,范围很宽,把除了控制语句和输入/输出以外的几乎所有的基本操作都作为运算符处理,所以C语言运算符可以看作是操作符。C语言丰富的运算符构成C语言丰富的表达式(是运算符就可以构成表达式)。运算符丰富、表达式丰富、灵活。在C语言中除了提供一般高级语言的算术、关系、逻辑运算符外,还提供赋值符运算符,位操作运算符、自增自减运算符等等。甚至数组下标,函数调用都作为运算符。第2页,本讲稿共25页 1算术运算符 (+-*/%
2、)2关系运算符 (=!=)3逻辑运算符 (!&|)4位运算符 (|&)5赋值运算符 (=及其扩展赋值运算符)6条件运算符 (?:)7逗号运算符 (,)8指针运算符 (*和&)9求字节数运算符 (s i z e o f)10强制类型转换运算符 (类型)11分量运算符 (-)12下标运算符 ()13其他 (如函数调用运算符()第3页,本讲稿共25页一、一、算术运算符及算术表达式算术运算符及算术表达式 1 算术运算符算术运算符+(加法运算符。如3+5)-(减法运算符或负值运算符。如5-2,-3)*(乘法运算符。如3*5)/(除法运算符。如5/3,5.0/3)%(模运算符或求余运算符,%要求两侧均为整
3、型数据。如7%4的值为3)。除了负值运算符-单目运算符外,其它都是双目运算符。如果参加+,-,*,/运算的两个数有一个为实数,则结果为double型,因为所有实数都按double型进行计算。Printf(“%f”,5/3f)=1.666667 Printf(“%f”,-5/3f)=-1.666667 求余运算符%,要求两个操作数均为整型,结果为两数相除所得 的余数。求余也称为求模。一般情况,余数的符号与被除数符号相同。例如:-8%5=-3;8%-5=3注意:整数/整数 值为整数 有一个是实数时值为实数 printf(“%d”,5/3);?值为1第4页,本讲稿共25页一、一、算术运算符及算术表达
4、式算术运算符及算术表达式2 算术表达式算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为算术表达式。运算对象可以是常量、变量、函数等。例如,下面是一个合法的C算术表达式。a*b/c-1.5+a。C语言算术表达式的书写形式与数学表达式的书写形式有一定的区别:C语言算术表达式的乘号(*)不能省略。例如:数学式b2-4ac,相应的C表达式应该写成:b*b-4*a*c。C语言表达式中只能出现字符集允许的字符。例如,数学r2相应的C表达式应该写成:PI*r*r。(其中PI是已经定义的符号常量)C语言算术表达式不允许有分子分母的形式。例如,(a+b)/(c+d)。
5、C语言算术表达式只使用圆括号改变运算的优先顺序(不要指望用)。可以使用多层圆括号,此时左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。第5页,本讲稿共25页一、一、算术运算符及算术表达式算术运算符及算术表达式常用数学系统函数 exp(x)log(x)log10(x)pow(x,y)练习:求60度角的余弦、log90、e2.567的值注意:引用数学函数时,一定要把头函数包含定上#include printf(“%f”,cos(60/180*3.14159);的错误在于 整数/整数 值为整数第6页,本讲稿共25页一、一、算术运算符及算术表达式算术运算符及算术表达式3自增、自减运
6、算符自增、自减运算符作用是使变量的值增1或减1,如:+i,-i(在使用i之前,先使i的值加(减)1)i+,i-(在使用i之后,使i的值加(减)1)粗略地看,+i和i+的作用相当于i=i+1。但+i和i+不同之处在于+i是先执行i=i+1后,再使用i的值;而i+是先使用i的值后,再执行i=i+1。如果i的原值等于3,则执行下面的赋值语句:=+i;(i的值先变成4,再赋给,j的值为4)=i+;(先将 i的值3赋给,的值为3,然后i变为4)又如:i=3;printf(%d,+i);第7页,本讲稿共25页一、一、算术运算符及算术表达式算术运算符及算术表达式输出“4”。若改为printf(%d,i+);
7、则输出“3”。注意:自增运算符(+)和自减运算符(-),只能用于变量,而不能用于常量或表达式,如5+或(a+b)+都是不合法的。因为5是常量,常量的值不能改变。(a+b)+也不可能实现,假如a+b的值为5,那么自增后得到的6放在什么地方呢?无变量可供存放。第8页,本讲稿共25页一、一、算术运算符及算术表达式算术运算符及算术表达式4强制类型转换运算符强制类型转换运算符可以利用强制类型转换运算符将一个表达式转换成所需类型。例如:(double)a (将a转换成double类型)(int)(x+y)(将x+y的值转换成整型)(float)(5%3)(将5%3的值转换成float型)其一般形式为(类型
8、名)(表达式)注意,表达式应该用括号括起来。如果写成(int)x+y则只将x转换成整型,然后与y相加。第9页,本讲稿共25页一、一、算术运算符及算术表达式算术运算符及算术表达式需要说明的是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。例如:(int)x(不要写成int(x)如果x原指定为float型,进行强制类型运算后得到一个int型的中间变量,它的值等于x的整数部分,而x的类型不变(仍为float型)。见下例。例3.8强制类型转换。main()float x;int i;第10页,本讲稿共25页一、一、算术运算符及算术表达式算术运算符及算术表达式 x=36;i=(i
9、nt)x;printf(x=%f,i=%d,x,i);运行结果如下:x=3.600000,i=3x类型仍为float型,值仍等于3.6。从上可知,有两种类型转换,一种是在运算时不必用户指定,系统自动进行的类型转换,如3+6.5。第二种是强制类型转换。当自动类型转换不能实现目的时,可以用强制类型转换。如“%”运算符要求其两侧均为整型量,若x为float型,则第11页,本讲稿共25页一、一、算术运算符及算术表达式算术运算符及算术表达式 “x%3”不合法,必须用:“(int)x%3”。强制类型转换运算优先于%运算,因此先进行(int)x的运算,得到一个整型的中间变量,然后再对3求模。此外,在函数调用
10、时,有时为了使实参与形参类型一致,可以用强制类型转换运算符得到一个所需类型的参数。第12页,本讲稿共25页 二、运算符的优先级与结合性二、运算符的优先级与结合性C语言规定了进行表达式求值过程中,各运算符的“优先级”和“结合性”。P306 C语言规定了运算符的“优先级”和“结合性”。在表达式求值时,先按运算符的“优先级别”高低次序执行。如表达式:a-b*c等价于a-(b*c),“*”运算符优先级高于“-”运算符。如果在一个运算对象两侧的运算符的优先级别相同,则按规定的“结合方向”处理。例如:a-b+c,到底是(a-b)+c还是a-(b+c)?(b先与a参与运算还是先于c参与运算?)查附录可知:+
11、/-运算优先级别相同,结合性为“自左向右”,即就是说b先与左边的a结合。所以a-b+c等价于(a-b)+c。左结合性(自左向右结合方向):运算对象先与左面的运算符结合。右结合性(自右向左结合方向):运算对象先与右面的运算符结合。第13页,本讲稿共25页二、运算符的优先级与结合性二、运算符的优先级与结合性 在书写多个运算符的表达式时,应当注意各个运算符的优先级,确保表达式中的运算符能以正确的顺序参与运算。对于复杂表达式为了清晰起见可以加圆括号“()”强制规定计算顺序。结合:自右向左的,单目、三目条件、赋值第14页,本讲稿共25页 三、赋值运算符和赋值表达式三、赋值运算符和赋值表达式 1 赋值运算
12、符赋值运算符 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用是执行一次赋值操作(或称赋值运算)。把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。2 类型转换类型转换 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。(1)将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。如i为整型变量,执行“i=3.56”的结果是使i的值为3,在内存中以整数形式存储。(2)将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中,如将23赋给float变量f,即f=23,先将23转换成2300000,再存储在f
13、中。如将23赋给double型变量d,即d=23,则将23补足有效位数字为2300000000000000,然后以双精度浮点数形式存储到d中。第15页,本讲稿共25页三、赋值运算符和赋值表达式三、赋值运算符和赋值表达式(3)字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为2个字节,因此将字符数据(8位)放到整型变量低8位中。第16页,本讲稿共25页三、赋值运算符和赋值表达式三、赋值运算符和赋值表达式3 复合的赋值运算符复合的赋值运算符在赋值符“=”之前加上其他运算符,可以构成复合的运算符。如果在“=”前加一个“+”运算符就成了复合运算符“+=”。例如,可以有:a+=3等价于a=a+
14、3 x*=y+8 等价于 x=x*(y+8)x%=3 等价于 x=x%3以“a+=3”为例来说明,它相当于使a进行一次自加(3)的操作。即先使a加3,再赋给a。同样,“x*=y+8”的作用是使x乘以(y+8),再赋给x。为便于记忆,可以这样理解:第17页,本讲稿共25页三、赋值运算符和赋值表达式三、赋值运算符和赋值表达式 a+=b (其中a为变量,b为表达式)a+=b (将有下划线的“a+”移到“=”右侧)a=a+b (在“=”左侧补上变量名a)注意,如果b是包含若干项的表达式,则相当于它有括号。如:x%=y+3 x%=(y+3)x=x%(y+3)(不要错写成x=x%y+3)凡是二元(二目)运
15、算符,都可以与赋值符一起组合成复合赋值符。c语言规定可以使用10种复合赋值运算符。即:第18页,本讲稿共25页三、三、赋值运算符和赋值表达式赋值运算符和赋值表达式+=,-=,*=,/=,%=,=,&=,=,|=后5种是有关位运算的,将在第11章介绍。C采用这种复合运算符,一是为了简化程序,使程序精炼,二是为了提高编译效率(这样写法与“逆波兰”式一致,有利于编译,能产生质量较高的目标代码。学过编译原理的读者对此容易理解,其他读者可不必深究)。4 赋值表达式赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。它的一般形式为第19页,本讲稿共25页三、赋值运算符和赋值表达式
16、三、赋值运算符和赋值表达式如“a=5”是一个赋值表达式。对赋值表达式求解的过程是:将赋值运算符右侧的“表达式”的值赋给左侧的变量。赋值表达式的值就是被赋值的变量的值。例如,“a=5”这个赋值表达式的值为5(变量a的值也是5)。上述一般形式的赋值表达式中的“表达式”,又可以是一个赋值表达式。如a=(b=5)括弧内的“b=5”是一个赋值表达式,它的值等于5。“a=(b=5)”相当于“b=5”和“a=b”两个赋值表达式,因此a的值等于5,整个赋值表达式的值也等于5。赋值运算符按照“自右而左”的结合顺序,因此,“b=5”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”第20页,本讲稿共25页三
17、、赋值运算符和赋值表达式三、赋值运算符和赋值表达式等价,都是先求“b=5”的值(得5),然后再赋给a,下面是赋值表达式的例子:a=b=c=5(赋值表达式值为5,a、b、c值均为5)a=5+(c=6)(表达式值为11,a值为11,c值为6)a=(b=4)+(c=6)(表达式值为10,a值为10,b等于4,c等于6)a=(b=10)/(c=2)(表达式值为5,a等于5,b等于10,c等于2)赋值表达式也可以包含复合的赋值运算符。如:a+=a-=a*a也是一个赋值表达式。第21页,本讲稿共25页三、赋值运算符和赋值表达式三、赋值运算符和赋值表达式如果a的初值为12,此赋值表达式的求解步骤如下:先进行
18、“a-=a*a”的运算,它相当于a=a-a*a=12-144=-132。再进行“a+=-132”的运算,相当于a=a+(-132)=-132-132=-264。将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中,如:printf(%d,a=b);如果b的值为3,则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。这是c语言灵活性的一种表现。在第5章中将进一步看到这种应用及其优越性。在下一章介绍“语句”之后,就可以了解到赋值表达式和赋值语句之间的联系和区别了。第22页,本讲稿共25页四、逗号
19、运算符和逗号表达式四、逗号运算符和逗号表达式其一般形式为:(表达式1,表达式2)其求值过程是分别求表达式1、表达式2的值,并以表达式2的值作为整个逗号表达式的值。例3.5main()int a=2,b=4,c=6,x,y;y=(x=a+b,b+c);printf(y=%d,x=%d,y,x);第23页,本讲稿共25页结语结语表达式是数据的表演规则,是程序运算的基本方式。要注意各类数据成员的优先权,把握不好就用括号。main()int i=3,j=4,a,b,c;a=(i+)+(i+)+(i+);b=(+j)+(+j)+(+j);c=i+-j;printf(%d,%d,%d,%d,%d,a,b,c,i,j);第24页,本讲稿共25页main()int b=2,x,y;float i=0.1;x=2+b;y=2-+b printf(%d%d%f,x,y,+i);main()int a,b;a=(b=3)+(b=2);printf(a=%d b=%d,a,b);第25页,本讲稿共25页