教学第3章C语言运算符和表达式课件_第1页
教学第3章C语言运算符和表达式课件_第2页
教学第3章C语言运算符和表达式课件_第3页
教学第3章C语言运算符和表达式课件_第4页
教学第3章C语言运算符和表达式课件_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章运算符和表达式3.1表达式

3.2算术运算符3.3赋值运算符3.4不同数据类型数据间的混合运算3.5自增、自减运算符3.6 逗号运算符

3.7 其它运算符 本章小结习题参考答案11/26/20221第3章运算符和表达式3.1表达式 11/22/203.1表达式 一.表达式表达式是由运算对象、运算符按照C语言的语法规则构成的符号序列。表达式可以通过运算产生一个结果或完成某种操作。C语言的表达式功能很强,也很复杂,它提供了许多种运算符11/26/202223.1表达式 一.表达式11/22/20222cse.c3.1表达式 二.运算符运算符是C语言里用于描述对数据进行运算的特殊符号。C语言有三大运算符:算术、关系与逻辑、位操作。C语言还有一些已超出了一般运算符概念的特殊运算符。11/26/202233.1表达式 二.运算符11/22/20223cse.c3.1表达式 三.运算符和表达式的分类1.运算符的分类①按在表达式中与运算对象的关系(所需要运算对象的个数)可以分为:单目运算符双目运算符三目运算符学习运算符应注意:运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型11/26/202243.1表达式 三.运算符和表达式的分类学习运算符应注意:3.1表达式 ②按它们在表达式中所起的作用又可以分为:算术运算符:+、-、*、/、%赋值运算符:=、+=、-=、*=、/=、%=、 &=、|=、^=、<<=、>>=自增自减运算符:++、--关系运算符:<、<=、>、>=、==、!=逻辑运算符:!、&&、||条件运算符:?:位运算符:~、&、^、|、<<、>>逗号运算符:,其它运算符:()、[]、->、.、(类型名)、*、&、sizeof11/26/202253.1表达式 ②按它们在表达式中所起的作用又可以分为:3.1表达式 2.表达式的分类①按照运算符要求运算对象的个数可以分为:单目表达式双目表达式三目表达式②按照运算符在表达式中的作用,可以分为:算术表达式赋值表达式自增、自减表达式关系表达式逻辑表达式逗号表达式11/26/202263.1表达式 2.表达式的分类11/22/20226cs3.1表达式 四.优先级和结合性优先级指同一个表达式中不同运算符进行运算时的优先次序。结合性是针对同一优先级的多个运算符而言的,它是指同一个表达式中相同优先级的多个运算是自左向右进行运算还是自右向左进行运算。关于C语言运算符的含义、类型、优先级、结合性等问题见附录B。11/26/202273.1表达式 四.优先级和结合性11/22/20227c3.2算术运算符一.算术运算符

+:加法运算符-:减法运算符*:乘法运算符/:除法运算符 当运算对象均为整数时运算结果也为整数。(P43)%:求余运算符(模运算符)。 要求%两侧运算对象均为整型数据。算术运算符均为双目运算符,均具有左结合性。*、/、%的优先级为3级,+、-的优先级为4级。11/26/202283.2算术运算符一.算术运算符11/22/20228c>算术运算符基本算术运算符:+-*/%结合方向:从左向右优先级:----->*/%----->+-

(2)(3)(4)说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据+-*/运算的两个数中有一个数为实数,结果是double型例5/2=-5/2.0=例5%2=-5%2=1%10=

5%1=5.5%2例5/2=2

-5/2.0=-2.5例5%2=1

-5%2=-11%10=

1

5%1=

05.5%2()<11/26/20229>算术运算符例5/2=例5%23.2算术运算符二.算术表达式算术表达式是用算术运算符和括号将运算对象连接起来的、符合C语言的语法规则的式子。例:a+b、2+3/5、a/b/c

使用算术表达式时应注意:(1)当双目算术运算符两侧运算对象的类型一致时,运算结果的类型与运算对象的类型相同,如果类型不一致,系统将自动按规律先将运算对象转换为同一类型,然后再进行运算。11/26/2022103.2算术运算符二.算术表达式11/22/202210c3.2算术运算符二.算术表达式(2)可以用括号改变表达式的运算顺序,左右括号必须配对,多层括号都用小括号“()”表示。表达式2*(3+(7-2)/2)的运算顺序是?=2*(3+5/2)=2*(3+2)=2*5=1011/26/2022113.2算术运算符二.算术表达式=2*(3+5/2)=2*3.2算术运算符二.算术表达式(3)注意算术表达式的书写形式,不要写成代数式的形式。表达式中的所有字符都是写在同一行上,没有分式,也没有上下标,如代数式,应该写成(a+b)/(c-d),括号不能省略,若省略括号,表达式成了a+b/c-d。有些代数式无法直接写出,还要调用数学函数来完成,如?11/26/2022123.2算术运算符二.算术表达式表达式中的所有字符都是写在3.3赋值运算符一.普通赋值运算符1.赋值运算符赋值符号“=”就是赋值运算符,其功能是将赋值运算符“=”右侧表达式的值求出并将结果赋值给“=”左侧的变量。赋值运算符的优先级很低,仅高于逗号运算符,为右结合性。11/26/2022133.3赋值运算符一.普通赋值运算符11/22/202213.3赋值运算符2.赋值表达式用赋值运算符将一个变量和一个表达式连接起来的符合C语言语法的式子称做赋值表达式。它的一般形式为: 变量名=表达式赋值表达式的结果是赋值号右侧的表达式的值。求解赋值表达式时,如果赋值运算符两侧的数据类型不一致,赋值时要进行类型转换。转换的原则是将右侧的表达式的值转换为左侧变量的类型再进行对左侧变量赋值。11/26/2022143.3赋值运算符2.赋值表达式11/22/202214c>简单赋值运算符(见P44例3.1、3.2)符号:=格式:变量标识符=表达式作用:将一个数据(常量或表达式)赋给一个变量左侧必须是变量,不能是常量或表达式例a=3;d=func();c=d+2;例3=x-2*y;a+b=3;(×)<类型转换赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型例

floatf;inti=10;f=i;则

f=10.0例inti;i=2.56;//结果i=2;11/26/202215>简单赋值运算符(见P44例3.1、3.2)例a=3.3赋值运算符二.复合赋值运算符在赋值运算符“=”之前加上其它一些双目运算符可以构成复合赋值运算符,用于完成运算、赋值组合操作。C语言中复合赋值运算符的一般形式为: 运算符=其中“运算符”可以是: +、-、*、/、%、|、&、^、<<、>>所构成的复合赋值运算符是: +=、-=、*=、/=、%=、|=、&=、^=、<<=、>>=所有的赋值运算符包括复合赋值运算符的优先级全部相同,均为右结合性。11/26/2022163.3赋值运算符二.复合赋值运算符11/22/20221复合赋值运算符种类:+=-=*=/=%=<<=>>=&=^=|=含义:exp1op=exp2exp1=exp1opexp2a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%311/26/202217复合赋值运算符a+=3a=a+3x*=y+8x=x*(y+83.3赋值运算符由复合赋值运算符将一个变量和一个表达式连接起来的式子称为复合赋值表达式。它的一般形式为: 变量名复合赋值运算符表达式复合赋值表达式的作用等价于: 变量名=变量名运算符(表达式)即先将变量和表达式进行复合赋值运算符所指定的运算,然后将运算结果赋给变量。复合赋值表达式的值就是复合赋值运算符左侧变量被赋值以后的值。11/26/2022183.3赋值运算符由复合赋值运算符将一个变量和一个表达式连3.4不同数据类型数据间的混合运算一.自动类型转换(p46)整型、实型、字符型数据间可以混合进行算术运算。进行运算时,参与运算的操作数的数据类型要一致,若参与运算的数据类型不同,先要将其转换为相同的类型,然后再进行运算。11/26/2022193.4不同数据类型数据间的混合运算一.自动类型转换3.4不同数据类型数据间的混合运算一.自动类型转换横向箭头表示必须的转换,纵向箭头表示当运算符两侧的运算对象为不同类型时的转换,这些转换都是由系统自动进行的。P47高低doublelongunsignedintchar,shortfloat11/26/2022203.4不同数据类型数据间的混合运算一.自动类型转换高低d>doublefloatlongunsignedintchar,short低高说明:必定的转换运算对象类型不同时转换例charch;inti;floatf;doubled;ch/i+f*d-(f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+‘a’+i*f-d/l例inti;floatf;doubled;longl;<P47例3.4#include<stdio.h>main(){ inta=2,b=5; charc=’a’; floatx=2.5,y=3.3,z; z=c/2+x/a-y*b; printf("%f\n",z);}11/26/202221>doublefloatlongunsignedintcha3.4不同数据类型数据间的混合运算二.强制类型转换强制类型转换是通过类型转换运算来实现的。其一般形式为: (类型说明符)(表达式)(类型说明符)是类型转换运算符,单目运算,优先级别为2级,具右结合性。在类型转换运算符的右侧跟上表达式形成类型转换表达式,其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。11/26/2022223.4不同数据类型数据间的混合运算二.强制类型转换11/>强制转换(见P48强制类型转换运算符部分)一般形式:(类型名)(表达式)例:(int)(x+y)(int)x+y(double)(3/2)(int)3.6说明:强制转换得到所需类型的中间变量,原变量类型不变例:#include<stdio>main(){floatx;inti;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);}结果:x=3.600000,i=3精度损失问题较高类型向较低类型转换时可能发生强制类型转换运算符表达式仅一个变量时,括号可以省略

<11/26/202223>强制转换(见P48强制类型转换运算符部分)例:精度损失问题例3.5对比以下两个程序(P48)#include<stdio.h>#include<stdio.h>main()main(){{ inta,b;inta,b; floatx;floatx; a=10;a=10; b=4;b=4; x=3.2+a/b;x=3.2+(float)a/b;printf(“x=%f\n“,x);printf("x=%f\n“,x);}}?11/26/202224例3.5对比以下两个程序(P48)#include<s3.4不同数据类型数据间的混合运算三.强制类型转换赋值表达式的类型转换当赋值运算符两侧的运算对象数据类型不同时,系统也将进行自动类型转换,转换规则为:将赋值运算符右侧表达式的类型转换为左侧变量的类型。11/26/2022253.4不同数据类型数据间的混合运算三.强制类型转换赋值表例3.6赋值运算的自动类型转换。#include<stdio.h>main(){ charc=‘a’; inta=321,b,i; unsignedm=4294967295,n; floatx=2.5,y; doubled=12345678.987; printf("c=%c,a=%d,m=%u,x=%f,d=%f\n“,c,a,m,x,d); c=a;b=x;y=a;x=d;i=m;n=-l; printf("c=%c,b=%d,y=%f,x=%f,i=%d,n=%u\n“,c,b,y,x,i,n);}/*注意这个m的值有些特殊*/11/26/202226例3.6赋值运算的自动类型转换。#include<std3.4不同数据类型数据间的混合运算(1)浮点型与整型相互转换将浮点数据(包括单、双精度)转换为整型时,将舍弃浮点数的小数部分,只保留整数部分。(2)单、双精度浮点型相互转换由于C语言中的浮点值总是用双精度表示的,所以float型数据只是在尾部加0延长为double型数据参加运算,然后直接赋值。double型数据转换为float型时,先截取双精度实数的前7位有效数字,然后再赋给单精度类型的变量。11/26/2022273.4不同数据类型数据间的混合运算(1)浮点型与整型相互3.4不同数据类型数据间的混合运算(3)字符型与整型相互转换将整型数据赋给字符型变量时,由于整型数据用两个字节存放,而字符型数据用一个字节存放,所以只保留其低8位赋给字符型变量,高位部分舍弃。字符型数据赋给整型变量时,将字符数据的8位放入整型变量的低8位中,有些编译系统在整型变量的高8位补0;而有些编译系统(如TurboC),根据字符的最高位为0或1将高8位全部补0或补1。11/26/2022283.4不同数据类型数据间的混合运算(3)字符型与整型相互3.4不同数据类型数据间的混合运算(4)整型与长整型相互转换长整型数据赋值给整型变量时,将低16位值送给整型变量,将高16位截断舍弃。将整型数据赋值给长整型变量时,将整型数据的16位送到长整型变量的低16位中,根据整型数据符号位为0或1,在长整型的高16位全部补0或1,以保持数值不改变。11/26/2022293.4不同数据类型数据间的混合运算(4)整型与长整型相互3.4不同数据类型数据间的混合运算(5)无符号整数与有符号整数相互转换若占据同样长度存储单元的有符号、无符号整型相互转换时,是原样赋值,内部的存储方式不变,但外部值可能改变。若占据不同长度存储单元的有符号、无符号整型之间转换,先参照(4)中所述方式进行转换,再按上面字节数相同的方式直接赋值。11/26/2022303.4不同数据类型数据间的混合运算(5)无符号整数与有符3.5自增、自减运算符一.自增自减运算符、表达式++:自增运算符,使变量的值增加1。--:自减运算符,使变量的值减少1。自增、自减运算符均为单目运算符,优先级为2,具右结合性。11/26/2022313.5自增、自减运算符一.自增自减运算符、表达式11/23.5自增、自减运算符一.自增自减运算符、表达式自增、自减运算符都有两种用法:前置运算将++或--运算符置于变量之前,一般形式为:++变量、--变量。其功能是使变量的值增(减)1,然后再以变化后的变量值参与其它运算,即先增减、后运算。后置运算将++或--运算符置于变量之后,一般形式为:变量++、变量--。其功能是变量先参与其它运算,然后再使变量的值增(减)1,即先运算、后增减。11/26/2022323.5自增、自减运算符一.自增自减运算符、表达式11/2>自增、自减运算符++--作用:使变量值加1或减1种类:前置++i,--i(先执行i+1或i-1,再使用i值)后置i++,i--(先使用i值,再执行i+1或i-1)例 j=3;k=++j; j=3;k=j++; j=3;printf(“%d”,++j); j=3;printf(“%d”,j++); a=3;b=5;c=(++a)*b; a=3;b=5;c=(a++)*b;//k=4,j=4//k=3,j=4//4,j=4//3,j=4//c=20,a=4//c=15,a=4<11/26/202233>自增、自减运算符++--例 j=3;k=++j;>几点说明:例-i++i=3;printf(“%d”,-i++);

-(i++)//-3

++--不能用于常量和表达式,如5++,(a+b)++++--结合方向:自右向左优先级:-++-------->*/%----->+-

(2)(3)(4)该运算符常用于循环语句中,使循环变量加减1有关表达式使用中的问题说明不同系统对运算符和表达式的处理次序不同,尽可能写通用性强的语句不要写有歧义和不知系统如何执行的程序<P51例3.711/26/202234>几点说明:例-i++-(i++)//-3++-3.5自增、自减运算符二.关于自增自减运算符、表达式的说明自增、自减运算符实际上属于赋值运算符,不能应用于常量和表达式,操作对象只能是变量。一般自增自减表达式或是以表达式语句的形式出现,或是出现在for循环语句中使循环控制变量加(减)1,或应用于指针变量,使指针指向下(上)一个地址。其它将自增自减表达式应用于另一个表达式内部的形式,在尚未熟练掌握时尽量不去使用。最好不要使用诸如i+++j、(i++)+(i++)此类容易产生歧义或错误的形式。11/26/2022353.5自增、自减运算符二.关于自增自减运算符、表达式的说例3.8自增、自减运算符的特别用法#include<stdio.h>main(){ inti,j,m,n; i=5;j=5; m=(i++)+(i++); n=(++j)+(++j); printf("%d,%d\n",m,n); printf("%d,%d\n",i,j);}注意:++、--、&&、||、>=、<=、==、!=运算符中间不能有空格。11/26/202236例3.8自增、自减运算符的特别用法#include<s3.6 逗号运算符 逗号运算符就是用逗号“,”作为操作符,它可以把多个表达式连接起来形成逗号表达式。逗号运算符又称顺序求值运算符。逗号运算符为双目运算,其优先级别是C中所有运算符中最低的,具左结合性。逗号表达式扩展为n元运算的形式:表达式1,表达式2,……,表达式n逗号表达式的求值过程是自左向右,依次计算各子表达式的值,最右侧子表达式“表达式n”的值即为整个逗号表达式的值。11/26/2022373.6 逗号运算符 逗号运算符就是用逗号“,”作为操作符,它>逗号运算符和逗号表达式形式:表达式1,表达式2,……表达式n结合性:从左向右优先级:15,级别最低逗号表达式的值:等于表达式n的值用途:常用于循环for语句中例a=3*5,a*4a=3*5,a*4,a+5例x=(a=3,6*3)x=a=3,6*a例a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);//a=15,表达式值60//a=15,表达式值20//赋值表达式,表达式值18,x=18//逗号表达式,表达式值18,x=3//1,2,3//3,2,3<11/26/202238>逗号运算符和逗号表达式例a=3*5,a*4//a=1例3.9逗号运算符(P53)#include<stdio.h>main(){ inta,b,i,i,k; i=(a=3,a*5); k=(j=b=5,a+b); printf("%d,%d,%d,%d,%d\n“,a,b,I,j,k); printf("%d\n“,5,6); printf("%d\n“,(5,6));}11/26/202239例3.9逗号运算符(P53)#include<std3.7 其它运算符sizeof的使用形式比较像是函数调用,但它是一种运算符。其一般应用形式为: sizeof(运算对象)sizeof运算的功能是求出运算对象在计算机的内存中所占用的字节数。其中运算对象可以是数据类型说明符或表达式,当运算对象是表达式时括号可省略。sizeof是单目运算符,优先级别为2,具右结合性,运算的结果是整型。11/26/2022403.7 其它运算符sizeof的使用形式比较像是函数调用,但例3.10sizeof运算符(P54)#include<stdio.h>main(){ inta,b,c,d; doublex=1.23; a=sizeof(long); b=sizeof(x+3); c=sizeofx+3; d=sizeof("\"ab\123\abc\"\n"); printf("%d,%d,%d,%d\n",a,b,c,d);}11/26/202241例3.10sizeof运算符(P54)#includ请问下面的程序输出什么?#include<stdio.h>intmain(){ inti; i=10; printf("i:%d\n",i); printf("sizeof(i++)is:%d\n",sizeof(i++)); printf("i:%d\n",i); return0;}结果:102对吗?11结果是:10210Why?11/26/202242请问下面的程序输出什么?#include<stdio.h>本章小结本章主要介绍了运算符与表达式,其中涉及到的重要概念有:运算对象的个数、运算优先级、结合性、类型转换等。运算符是C语言里用于描述对数据进行运算的特殊符号。表达式是由运算符连接常量、变量、函数所组成的式子,每个表达式都有一个值和类型。表达式求值按运算符的优先级和结合性所规定的顺序进行。11/26/202243本章小结本章主要介绍了运算符与表达式,其中涉及到的重要概念有本章小结1.运算符优先级和结合性一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,而单目运算符、三目运算符、赋值运算符具有右结合性。11/26/202244本章小结1.运算符优先级和结合性11/22/202244cs本章小结2.算术运算符(1)整数相除是做整除,结果也为整数。(2)求余运算要求运算对象均为整型。(3)注意运算时的类型转换问题。(4)注意C语言表达式与数学公式在形式上的差异11/26/202245本章小结2.算术运算符11/22/202245cse.csl本章小结3.赋值运算符(1)赋值表达式的左边必须为变量。(2)复合赋值运算符的优先级全部在同一级别。(3)注意赋值时的类型转换。11/26/202246本章小结3.赋值运算符11/22/202246cse.csl本章小结4.类型转换(1)自动转换:在不同类型数据的混合运算中,由系统自动实现转换,由少字节类型向多字节类型转换。(2)强制转换:由强制转换运算符完成转换。(3)赋值时的类型转换:不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左边变量的类型。(4)无论是系统所做的自动类型转换还是强制类型转换,都只是将常量、变量、表达式的值进行转换去参与运算,不会改变变量的数据类型和值。11/26/202247本章小结4.类型转换11/22/202247cse.cslg本章小结5.自增、自减运算符(1)自增、自减其实也是赋值运算,只能针对变量做自增、自减运算。(2)注意前置运算(先增减后运算)与后置运算(先运算后增减)对所在表达式的影响的不同6.逗号运算符(1)逗号表达式的值取最后一个表达式的值。(2)逗号运算符的优先级最低。7.其它运算符(1)sizeof是运算符,不是函数名。(2)sizeof求表达式在内存中所占的字节数。11/26/202248本章小结5.自增、自减运算符11/22/202248cse.第3章运算符和表达式3.1表达式

3.2算术运算符3.3赋值运算符3.4不同数据类型数据间的混合运算3.5自增、自减运算符3.6 逗号运算符

3.7 其它运算符 本章小结习题参考答案11/26/202249第3章运算符和表达式3.1表达式 11/22/203.1表达式 一.表达式表达式是由运算对象、运算符按照C语言的语法规则构成的符号序列。表达式可以通过运算产生一个结果或完成某种操作。C语言的表达式功能很强,也很复杂,它提供了许多种运算符11/26/2022503.1表达式 一.表达式11/22/20222cse.c3.1表达式 二.运算符运算符是C语言里用于描述对数据进行运算的特殊符号。C语言有三大运算符:算术、关系与逻辑、位操作。C语言还有一些已超出了一般运算符概念的特殊运算符。11/26/2022513.1表达式 二.运算符11/22/20223cse.c3.1表达式 三.运算符和表达式的分类1.运算符的分类①按在表达式中与运算对象的关系(所需要运算对象的个数)可以分为:单目运算符双目运算符三目运算符学习运算符应注意:运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型11/26/2022523.1表达式 三.运算符和表达式的分类学习运算符应注意:3.1表达式 ②按它们在表达式中所起的作用又可以分为:算术运算符:+、-、*、/、%赋值运算符:=、+=、-=、*=、/=、%=、 &=、|=、^=、<<=、>>=自增自减运算符:++、--关系运算符:<、<=、>、>=、==、!=逻辑运算符:!、&&、||条件运算符:?:位运算符:~、&、^、|、<<、>>逗号运算符:,其它运算符:()、[]、->、.、(类型名)、*、&、sizeof11/26/2022533.1表达式 ②按它们在表达式中所起的作用又可以分为:3.1表达式 2.表达式的分类①按照运算符要求运算对象的个数可以分为:单目表达式双目表达式三目表达式②按照运算符在表达式中的作用,可以分为:算术表达式赋值表达式自增、自减表达式关系表达式逻辑表达式逗号表达式11/26/2022543.1表达式 2.表达式的分类11/22/20226cs3.1表达式 四.优先级和结合性优先级指同一个表达式中不同运算符进行运算时的优先次序。结合性是针对同一优先级的多个运算符而言的,它是指同一个表达式中相同优先级的多个运算是自左向右进行运算还是自右向左进行运算。关于C语言运算符的含义、类型、优先级、结合性等问题见附录B。11/26/2022553.1表达式 四.优先级和结合性11/22/20227c3.2算术运算符一.算术运算符

+:加法运算符-:减法运算符*:乘法运算符/:除法运算符 当运算对象均为整数时运算结果也为整数。(P43)%:求余运算符(模运算符)。 要求%两侧运算对象均为整型数据。算术运算符均为双目运算符,均具有左结合性。*、/、%的优先级为3级,+、-的优先级为4级。11/26/2022563.2算术运算符一.算术运算符11/22/20228c>算术运算符基本算术运算符:+-*/%结合方向:从左向右优先级:----->*/%----->+-

(2)(3)(4)说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据+-*/运算的两个数中有一个数为实数,结果是double型例5/2=-5/2.0=例5%2=-5%2=1%10=

5%1=5.5%2例5/2=2

-5/2.0=-2.5例5%2=1

-5%2=-11%10=

1

5%1=

05.5%2()<11/26/202257>算术运算符例5/2=例5%23.2算术运算符二.算术表达式算术表达式是用算术运算符和括号将运算对象连接起来的、符合C语言的语法规则的式子。例:a+b、2+3/5、a/b/c

使用算术表达式时应注意:(1)当双目算术运算符两侧运算对象的类型一致时,运算结果的类型与运算对象的类型相同,如果类型不一致,系统将自动按规律先将运算对象转换为同一类型,然后再进行运算。11/26/2022583.2算术运算符二.算术表达式11/22/202210c3.2算术运算符二.算术表达式(2)可以用括号改变表达式的运算顺序,左右括号必须配对,多层括号都用小括号“()”表示。表达式2*(3+(7-2)/2)的运算顺序是?=2*(3+5/2)=2*(3+2)=2*5=1011/26/2022593.2算术运算符二.算术表达式=2*(3+5/2)=2*3.2算术运算符二.算术表达式(3)注意算术表达式的书写形式,不要写成代数式的形式。表达式中的所有字符都是写在同一行上,没有分式,也没有上下标,如代数式,应该写成(a+b)/(c-d),括号不能省略,若省略括号,表达式成了a+b/c-d。有些代数式无法直接写出,还要调用数学函数来完成,如?11/26/2022603.2算术运算符二.算术表达式表达式中的所有字符都是写在3.3赋值运算符一.普通赋值运算符1.赋值运算符赋值符号“=”就是赋值运算符,其功能是将赋值运算符“=”右侧表达式的值求出并将结果赋值给“=”左侧的变量。赋值运算符的优先级很低,仅高于逗号运算符,为右结合性。11/26/2022613.3赋值运算符一.普通赋值运算符11/22/202213.3赋值运算符2.赋值表达式用赋值运算符将一个变量和一个表达式连接起来的符合C语言语法的式子称做赋值表达式。它的一般形式为: 变量名=表达式赋值表达式的结果是赋值号右侧的表达式的值。求解赋值表达式时,如果赋值运算符两侧的数据类型不一致,赋值时要进行类型转换。转换的原则是将右侧的表达式的值转换为左侧变量的类型再进行对左侧变量赋值。11/26/2022623.3赋值运算符2.赋值表达式11/22/202214c>简单赋值运算符(见P44例3.1、3.2)符号:=格式:变量标识符=表达式作用:将一个数据(常量或表达式)赋给一个变量左侧必须是变量,不能是常量或表达式例a=3;d=func();c=d+2;例3=x-2*y;a+b=3;(×)<类型转换赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型例

floatf;inti=10;f=i;则

f=10.0例inti;i=2.56;//结果i=2;11/26/202263>简单赋值运算符(见P44例3.1、3.2)例a=3.3赋值运算符二.复合赋值运算符在赋值运算符“=”之前加上其它一些双目运算符可以构成复合赋值运算符,用于完成运算、赋值组合操作。C语言中复合赋值运算符的一般形式为: 运算符=其中“运算符”可以是: +、-、*、/、%、|、&、^、<<、>>所构成的复合赋值运算符是: +=、-=、*=、/=、%=、|=、&=、^=、<<=、>>=所有的赋值运算符包括复合赋值运算符的优先级全部相同,均为右结合性。11/26/2022643.3赋值运算符二.复合赋值运算符11/22/20221复合赋值运算符种类:+=-=*=/=%=<<=>>=&=^=|=含义:exp1op=exp2exp1=exp1opexp2a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%311/26/202265复合赋值运算符a+=3a=a+3x*=y+8x=x*(y+83.3赋值运算符由复合赋值运算符将一个变量和一个表达式连接起来的式子称为复合赋值表达式。它的一般形式为: 变量名复合赋值运算符表达式复合赋值表达式的作用等价于: 变量名=变量名运算符(表达式)即先将变量和表达式进行复合赋值运算符所指定的运算,然后将运算结果赋给变量。复合赋值表达式的值就是复合赋值运算符左侧变量被赋值以后的值。11/26/2022663.3赋值运算符由复合赋值运算符将一个变量和一个表达式连3.4不同数据类型数据间的混合运算一.自动类型转换(p46)整型、实型、字符型数据间可以混合进行算术运算。进行运算时,参与运算的操作数的数据类型要一致,若参与运算的数据类型不同,先要将其转换为相同的类型,然后再进行运算。11/26/2022673.4不同数据类型数据间的混合运算一.自动类型转换3.4不同数据类型数据间的混合运算一.自动类型转换横向箭头表示必须的转换,纵向箭头表示当运算符两侧的运算对象为不同类型时的转换,这些转换都是由系统自动进行的。P47高低doublelongunsignedintchar,shortfloat11/26/2022683.4不同数据类型数据间的混合运算一.自动类型转换高低d>doublefloatlongunsignedintchar,short低高说明:必定的转换运算对象类型不同时转换例charch;inti;floatf;doubled;ch/i+f*d-(f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+‘a’+i*f-d/l例inti;floatf;doubled;longl;<P47例3.4#include<stdio.h>main(){ inta=2,b=5; charc=’a’; floatx=2.5,y=3.3,z; z=c/2+x/a-y*b; printf("%f\n",z);}11/26/202269>doublefloatlongunsignedintcha3.4不同数据类型数据间的混合运算二.强制类型转换强制类型转换是通过类型转换运算来实现的。其一般形式为: (类型说明符)(表达式)(类型说明符)是类型转换运算符,单目运算,优先级别为2级,具右结合性。在类型转换运算符的右侧跟上表达式形成类型转换表达式,其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。11/26/2022703.4不同数据类型数据间的混合运算二.强制类型转换11/>强制转换(见P48强制类型转换运算符部分)一般形式:(类型名)(表达式)例:(int)(x+y)(int)x+y(double)(3/2)(int)3.6说明:强制转换得到所需类型的中间变量,原变量类型不变例:#include<stdio>main(){floatx;inti;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);}结果:x=3.600000,i=3精度损失问题较高类型向较低类型转换时可能发生强制类型转换运算符表达式仅一个变量时,括号可以省略

<11/26/202271>强制转换(见P48强制类型转换运算符部分)例:精度损失问题例3.5对比以下两个程序(P48)#include<stdio.h>#include<stdio.h>main()main(){{ inta,b;inta,b; floatx;floatx; a=10;a=10; b=4;b=4; x=3.2+a/b;x=3.2+(float)a/b;printf(“x=%f\n“,x);printf("x=%f\n“,x);}}?11/26/202272例3.5对比以下两个程序(P48)#include<s3.4不同数据类型数据间的混合运算三.强制类型转换赋值表达式的类型转换当赋值运算符两侧的运算对象数据类型不同时,系统也将进行自动类型转换,转换规则为:将赋值运算符右侧表达式的类型转换为左侧变量的类型。11/26/2022733.4不同数据类型数据间的混合运算三.强制类型转换赋值表例3.6赋值运算的自动类型转换。#include<stdio.h>main(){ charc=‘a’; inta=321,b,i; unsignedm=4294967295,n; floatx=2.5,y; doubled=12345678.987; printf("c=%c,a=%d,m=%u,x=%f,d=%f\n“,c,a,m,x,d); c=a;b=x;y=a;x=d;i=m;n=-l; printf("c=%c,b=%d,y=%f,x=%f,i=%d,n=%u\n“,c,b,y,x,i,n);}/*注意这个m的值有些特殊*/11/26/202274例3.6赋值运算的自动类型转换。#include<std3.4不同数据类型数据间的混合运算(1)浮点型与整型相互转换将浮点数据(包括单、双精度)转换为整型时,将舍弃浮点数的小数部分,只保留整数部分。(2)单、双精度浮点型相互转换由于C语言中的浮点值总是用双精度表示的,所以float型数据只是在尾部加0延长为double型数据参加运算,然后直接赋值。double型数据转换为float型时,先截取双精度实数的前7位有效数字,然后再赋给单精度类型的变量。11/26/2022753.4不同数据类型数据间的混合运算(1)浮点型与整型相互3.4不同数据类型数据间的混合运算(3)字符型与整型相互转换将整型数据赋给字符型变量时,由于整型数据用两个字节存放,而字符型数据用一个字节存放,所以只保留其低8位赋给字符型变量,高位部分舍弃。字符型数据赋给整型变量时,将字符数据的8位放入整型变量的低8位中,有些编译系统在整型变量的高8位补0;而有些编译系统(如TurboC),根据字符的最高位为0或1将高8位全部补0或补1。11/26/2022763.4不同数据类型数据间的混合运算(3)字符型与整型相互3.4不同数据类型数据间的混合运算(4)整型与长整型相互转换长整型数据赋值给整型变量时,将低16位值送给整型变量,将高16位截断舍弃。将整型数据赋值给长整型变量时,将整型数据的16位送到长整型变量的低16位中,根据整型数据符号位为0或1,在长整型的高16位全部补0或1,以保持数值不改变。11/26/2022773.4不同数据类型数据间的混合运算(4)整型与长整型相互3.4不同数据类型数据间的混合运算(5)无符号整数与有符号整数相互转换若占据同样长度存储单元的有符号、无符号整型相互转换时,是原样赋值,内部的存储方式不变,但外部值可能改变。若占据不同长度存储单元的有符号、无符号整型之间转换,先参照(4)中所述方式进行转换,再按上面字节数相同的方式直接赋值。11/26/2022783.4不同数据类型数据间的混合运算(5)无符号整数与有符3.5自增、自减运算符一.自增自减运算符、表达式++:自增运算符,使变量的值增加1。--:自减运算符,使变量的值减少1。自增、自减运算符均为单目运算符,优先级为2,具右结合性。11/26/2022793.5自增、自减运算符一.自增自减运算符、表达式11/23.5自增、自减运算符一.自增自减运算符、表达式自增、自减运算符都有两种用法:前置运算将++或--运算符置于变量之前,一般形式为:++变量、--变量。其功能是使变量的值增(减)1,然后再以变化后的变量值参与其它运算,即先增减、后运算。后置运算将++或--运算符置于变量之后,一般形式为:变量++、变量--。其功能是变量先参与其它运算,然后再使变量的值增(减)1,即先运算、后增减。11/26/2022803.5自增、自减运算符一.自增自减运算符、表达式11/2>自增、自减运算符++--作用:使变量值加1或减1种类:前置++i,--i(先执行i+1或i-1,再使用i值)后置i++,i--(先使用i值,再执行i+1或i-1)例 j=3;k=++j; j=3;k=j++; j=3;printf(“%d”,++j); j=3;printf(“%d”,j++); a=3;b=5;c=(++a)*b; a=3;b=5;c=(a++)*b;//k=4,j=4//k=3,j=4//4,j=4//3,j=4//c=20,a=4//c=15,a=4<11/26/202281>自增、自减运算符++--例 j=3;k=++j;>几点说明:例-i++i=3;printf(“%d”,-i++);

-(i++)//-3

++--不能用于常量和表达式,如5++,(a+b)++++--结合方向:自右向左优先级:-++-------->*/%----->+-

(2)(3)(4)该运算符常用于循环语句中,使循环变量加减1有关表达式使用中的问题说明不同系统对运算符和表达式的处理次序不同,尽可能写通用性强的语句不要写有歧义和不知系统如何执行的程序<P51例3.711/26/202282>几点说明:例-i++-(i++)//-3++-3.5自增、自减运算符二.关于自增自减运算符、表达式的说明自增、自减运算符实际上属于赋值运算符,不能应用于常量和表达式,操作对象只能是变量。一般自增自减表达式或是以表达式语句的形式出现,或是出现在for循环语句中使循环控制变量加(减)1,或应用于指针变量,使指针指向下(上)一个地址。其它将自增自减表达式应用于另一个表达式内部的形式,在尚未熟练掌握时尽量不去使用。最好不要使用诸如i+++j、(i++)+(i++)此类容易产生歧义或错误的形式。11/26/2022833.5自增、自减运算符二.关于自增自减运算符、表达式的说例3.8自增、自减运算符的特别用法#include<stdio.h>main(){ inti,j,m,n; i=5;j=5; m=(i++)+(i++); n=(++j)+(++j); printf("%d,%d\n",m,n); printf("%d,%d\n",i,j);}注意:++、--、&&、||、>=、<=、==、!=运算符中间不能有空格。11/26/202284例3.8自增、自减运算符的特别用法#include<s3.6 逗号运算符 逗号运算符就是用逗号“,”作为操作符,它可以把多个表达式连接起来形成逗号表达式。逗号运算符又称顺序求值运算符。逗号运算符为双目运算,其优先级别是C中所有运算符中最低的,具左结合性。逗号表达式扩展为n元运算的形式:表达式1,表达式2,……,表达式n逗号表达式的求值过程是自左向右,依次计算各子表达式的值,最右侧子表达式“表达式n”的值即为整个逗号表达式的值。11/26/2022853.6 逗号运算符 逗号运算符就是用逗号“,”作为操作符,它>逗号运算符和逗号表达式形式:表达式1,表达式2,……表达式n结合性:从左向右优先级:15,级别最低逗号表达式的值:等于表达式n的值用途:常用于循环for语句中例a=3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论