C语言程序基础——运算符表达式主讲教师:齐林海控制与计算机工程学院学习目标掌握C语言的各种运算符及其对应的表达式;掌握运算法的优先性特点和结合型特点;掌握各种不同表达式混合运算的特点;数据运算后数据类型的变化;程序设计的顺序结构方法;C语言运算符简介算术运算符关系运算符逻辑运算符位运算法赋值运算符条件运算符逗号运算符指针运算符求字节数运算符强制类型转换运算符分量运算符下标运算符其他算术运算符和算术表达式基本的算术运算符+加法运算符,或正直运算符;-减法运算符,或负值运算符;*乘法运算符;/除法运算符。整除结果取整数,小数部分舍去;%模运算符,或求余运算符,%两侧均应为正整数,如7%4的值为3;算术表达式用算术运算符和括号将运算对象(操作数)连接起来、符合C语言语法规则的式子叫算术表达式;运算对象包括:常量、变量、函数等。算术运算符和算术表达式运算符的优先级和结合性优先级:在表达式求值时,按运算符的优先级别高低次序执行计算;优先级规定:先乘除后加减。结合性:如果运算对象两侧运算符的优先级相同,则按“自左向右”顺序进行计算。此为结合方向,即结合型。结合型规定:C语言规定的结合型为“先左后右”,即运算对象先与左侧的运算符结合运算,然后,再与右侧的运算符结合运算。算术运算符和算术表达式强制类型转换运算符:将一个表达式转换成所需类型。(double)a将a转换成为double类型;(int)(x+y)将(x+y)表达式的值的类型转换成为int类型;(float)(5%3)将5%3的值的类型转换成为float类型:一般形式:(类型名)(表达式)注意表达式一定用括弧括起来表达式的值的类型变化,但是,表达式各运算对象不发生变化;强制类型转换将形成一个中间结果,不对源对象产生影响;算术运算符和算术表达式(int)(x+y)与(int)x+y(int)(x+y)是将x+y这个表达式的计算结果的类型转换成为整型;(int)x+y是先将x类型转换成为整型后再进行加y运算;(int)x假设x已经声明为float类型;执行(int)x后,得到一个整型的中间结果,但是原来的x类型不变。算术运算符和算术表达式例题:强制类型转换#includestdio.hvoidmain(){floatx;inti;x=32767.0;i=(int)x%3;printf(“x=%f,i=%d\n”,x,i);}输出结果:x=32767.0,i=1%两侧必须是整数,x是实数,必须强制转换类型!但是,只要转换类型后的中间结果,原来x的类型及值不变!算术运算符和算术表达式自增自减运算符使变量的值增加或减少1;++i、--i使用i之前,先使i的值加(减)1;i++、i--使用i之后,使i的值加(减)1;#includestdio.hvoidmain(){inti,j;i=3;j=4;printf(“%d\n”,++i);printf(“%d\n”,j++);}注意事项:自增自减运算符只适用于变量,而不适用于表达式和常量;5++或(a+b)++都是非法的。因为,自增或自减后结果放在何处无法确定;++或—的结合方向是“自右向左”。#includestdio.hvoidmain(){inti;i=3;printf(“%d\n”,-i++);}运行结果是-3如果是:printf(“%d\n”,-++i);运行结果是-4.算术运算符和算术表达式自增自减运算符常用于循环语句中,用于循环控制变量的变化。赋值运算符和赋值表达式赋值运算符“=”称为赋值运算符作用是将一个数据赋给一个变量通常更多的是将一个表达式赋值给一个变量赋值运算符的左侧一定是一个变量,不能是一个表达式赋值运算符和赋值表达式类型转换赋值运算符两侧的数据类型可以不一致;这就牵扯到类型转换:浮点型数据赋值给整型变量:舍弃浮点数小数部分;整型数据赋值给浮点型变量:数值不变,但是以浮点数形式存贮到变量中;double数据赋值给float变量:截取其前面的7位有效数字,放在float变量的4个字节单元中;float数据赋值给double变量:数值不变,有效位扩展到16位;字符型数据赋值给整型变量:字符占1个字节,整数占两个字节。将字符数据(8位二进制)放到整数的低8位中;赋值运算符和赋值表达式复合的赋值运算符在赋值运算符“=”之前加上其他运算符,构成复合的赋值运算法;a+=3;相当于a=a+3;x*=y+8;相当于x=x*(y+8);x%=3;相当于x=x%3;凡是二目运算符,都可以与赋值运算符一起组合成复合的赋值运算;赋值运算符和赋值表达式赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子;变量赋值运算符表达式赋值表达式的求解过程1.先求赋值运算符右侧的“表达式”的值;2.然后赋给赋值运算符左侧的变量;赋值运算符左侧的标识符称为“左值”变量可以作为左值;表达式和常量不能作为左值;赋值运算符右侧的表达式称为“右值”“左值”可以作为“右值”赋值表达式的变化赋值表达式可以作为另一个赋值表达式的“右值”a=(b=5)先将5赋值给b,然后将b赋值给a,最后a为5.即表达式的值为5;赋值运算符遵循又结合,即从右向左;赋值运算符和赋值表达式所谓结合性是指当两个优先级相同的运算符在一起时的选择!a=b=c=5赋值表达式的值为5;a,b,c的值均为5;a=5+(c=6)赋值表达式的值为11;a为11,c为6;a=(b=4)+(c=6)赋值表达式值为10;a10,b4,c6;a=(b=10)/(c=2)赋值表达式值为5;a5,b6,c2;(a=3*5)=4*3先计算括弧内值为a=15;然后计算4*3=12赋值给a;最后,赋值表达式值为12;a=3*5=4*3不合法,3*5是表达式不能作为左值赋值运算符和赋值表达式逗号运算符:用一个逗号将两个表达式连接起来。又称为顺序求值运算符;逗号表达式的一般形式:表达式1,表达式2,…..,表达式n逗号表达式的求解过程:1.先求解表达式1;2.再求解表达式2;3.依次求解表达式值;4.整个表达式的值是表达式n的值;逗号运算符和逗号表达式逗号运算符的优先级和结合性逗号运算符的优先级是所有运算符中最低的;逗号运算符的结合性是从左到右;例题:3+5,5+8先求3+5=8,再计算5+8=13,整个表达式为13a=3*5,a*4逗号优先级最低,先计算a=3*5=15,再计算a*4=60.整个表达式值为60;(a=3*5,a*4),a+5括弧内嵌套了一个逗号表达式,然后,与后面的表达式组成了一个新的逗号表达式。括弧内的逗号表达式值为60,但是,这时a得值为15,所以a+5=20.即整个逗号表达式的值为20.x=a=3,6*3表达式的值为18x=(a=3,6*3)表达式的值为18.逗号运算符和逗号表达式逗号有时作为间隔符号!顺序结构程序设计AB顺序结构程序设计例1:输入两个数,交换内容#includestdio.hmain(){inta,b,temp;scanf(“%d%d”,&a,&b);temp=a;a=b;b=temp;printf(“%d,%d”,a,b);}ABTEMP顺序结构程序设计在键盘上输入一个小写字符,将其转换成大写字符后输出•#includestdio.h•voidmain()•{•charc;•c=getchar();•c=c-32;•putchar(c);•putchar('\n');•}‘a’…’z’的ASCII码为:97…122‘A’…’Z’的ASCII码为:65…90对应字母大小写相差32.顺序结构程序设计输入三角形的三边长(a,b,c),求三角形面积area;•#includestdio.h•#includemath.h•main()•{floata,b,c,s,area;•scanf(“%f,%f,%f”,&a,&b,&c);•s=1.0/2*(a+b+c);•area=sqrt(s*(s-a)*(s-b)*(s-c));•printf(“a=%7.2f,b=%7.2f,c=%7.2f,•area=%7.2f\n”,a,b,c,area);•})(21:))()((:cbascsbsassarea其中计算公式顺序结构程序设计输入任意三个整数,求它们的和及平均值#includestdio.hmain(){intn1,n2,n3,sum;floataver;printf(“Pleaseinputthreenumbers:”);scanf(“%d%d%d”,&n1,&n2,&n3);sum=n1+n2+n3;aver=sum/3.0;printf(n1=%d,n2=%d,n3=%d\n,n1,n2,n3);printf(sum=%d,aver=%7.2f\n,sum,aver);}自强不息、团结奋进爱校敬业、追求卓越