03 运算符与表达式、数据类型的转换

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第3讲运算符与表达式数据类型的转换1.目的、要求掌握运算符、表达式、优先级、结合性等概念;掌握赋值表达式、逗号表达式;掌握数据类型的转换。2.重点、难点数据类型的转换;自加、自减运算;优先级和结合性;赋值表达式与逗号表达式。运算(操作)是对数据的加工,通过对运算符的介绍,引入优先级的概念。重点介绍数据类型的转换,自加/自减运算,优先级和结合性,赋值表达式、逗号表达式。3.讲课思路变量有什么作用?真正实用的程序需要使用和处理的数据很多.因而需要定义一些变量,用于临时存储数据,以供在需要的时候取出使用。如:intx,y;对变量的任何使用都必须遵守“先定义后使用”的基本原则。例如,有如下一组操作:inta=12,b=7,t;doublex,y;t=a+b–2;x=a+1;y=x/4.0;使用变量变量定义与内存分配对于变量定义,计算机相应地会安排一个或几个字节的内存分配给该变量使用。例如:intva=1,vb;floatvx=3.14;1、每个程序在运行时有相应的内存区域;2、初始状态下内存区域的数据区中并没有安排变量,这时数据区各个字节中的数据是计算机随意安排的;3、对于每个变量定义,计算机在数据区中依次分配对应的内存单元。程序可用的的内存区域××××××××××××××××××××××va1vbvx3.14如何对变量进行操作?①赋值---把数据送入变量中保存(对变量进行写入操作)如:x=1;x=x+1;效果:新值取代旧值②取值---从变量中取出数据(对变量进行读取操作)如:y=x+1;效果:取之不尽对变量赋值是C语言最基本的命令之一。赋值语句格式:变量名=表达式;含义/功能:把表达式(即计算式,一定有计算结果)的计算结果送到变量所对应的内存中(简述“送到变量中”)。例如:intva;va=27*4-56;赋值1、语句---C语言中一条完整的命令称为一条语句;2、赋值语句是C语言中最常用的语句;3、赋值号“=”具有方向性,把右边的数据送到左边指定的存储单元,因此左右不可交换位置;4、不是方程。方程中的“=”表示左右相等,不具有方向性,因此方程左右两边可以交换位置。5、赋值语句中所使用的变量必须是已经定义的变量,即“先定义后使用”;6、对变量再次赋值时,“以新代旧”原则。赋值语句什么是运算符用于命令计算机完成某种特定计算的符号或写法。重要特征:强调计算结果,即计算得到的数据C语言支持的13类运算符(详见附录)算术运算符:+,-,*,/,%,++,--关系运算符:,,=,=,==,!=逻辑运算符:!,&&,||位运算符:,,~,|,^,&赋值运算符:=条件运算符:?:逗号运算符:,指针运算符:*,&求字节数运算符:sizeof强制类型转换运算符:类型分量运算符:.,-下标运算符:[]其它:如函数调用运算符()运算符有关概念运算符有关概念•i目运算符:要求i个运算量参加运算。如:+、-、*、/是双目(2目)运算符•运算量的类型:%要求两个运算量均为整型。•运算符优先级一个表达式中出现多种运算符时,如何计算?运算符优先级表,见附录。改变优先级的方法----括号()•与数学函数的关系表现形式不同。以%为例,有些语言没有%而设置MOD函数。•运算结果的类型:即表达式值的类型。赋值表达式的值就是变量获得的值。算术运算符•先乘除,后加减•正负号优先于乘除•%要求两侧均为整型量•++,--为单目运算符自减运算符“--”的使用格式仿照“++”;格式①和②的用法都可以加分号当语句使用,功能是把变量的值加1再送回该变量中。下面的两种写法功能上完全相同。i++;++i;格式①和②也可当数据使用。对于格式①,先把变量的值增1送回该变量中,再使用目前变量中存放的数据;对于格式②,先使用目前变量中存放的数据,再把变量的值增1送回该变量中;自增运算符与自减运算符(++与--)格式:①++变量名②变量名++自加/自减运算i++:先使用,后自加。i--:先使用,后自减。++i:先自加,后使用。--i:先自减,后使用。逐条解释下面各语句的操作过程:intx=1,y=5,z;x++;++y;z=++x;y=(x++)*(++z);++与--示例避免使用容易引起概念混淆的写法:y=x+++z;printf(%d,%d,y,y++);程序中的任何写法都必须注意:你到底想要计算机干什么,而不是让计算机试试能怎么做。•何时进行自加自减,举例说明如下(若i=3):—K=i++;执行后K=3,i=4。—K=(i++)+(i++)+(i++);执行后K=9,i=6。过程为:(1)取出i的原值3相加,得K=9;(2)i进行三次自加,得i=6。—K=(++i)+(++i)+(++i);执行后K=18,i=6。自加是在整个表达式求解一开始时最先进行的,故先对i进行三次自加得i=6,然后再进行K=6+6+6的运算。•C编译处理时,尽可能多的自左而右将若干个字符组成一个运算符,如:i+++j相当于(i++)+j。•上机实验:printf(“%d,%d”,i,i++);在TC下表达式自右向左求值,结果为(4,3)。凡二元运算符都可以和“=”组合在一起构成复合的赋值运算符,具体是:+=-=*=/=%===&=|=^=以“+=”为例,用法为:等价于:变量名=变量名+(表达式)复合的赋值运算符格式:变量名+=表达式设:inta=1,b=4,c=8;作为复合的赋值语句使用时a+=1;b–=1;c/=a+b;复合的赋值运算示例作为复合的赋值表达式使用时b=a+=1;c*=a–=b–1;a=a+1;b=b–1;c=c/(a+b);a=a+1;b=a;a=a–(b–1);c=c*a;运算的结合方向•当优先级无法确定运算次序时用如:a=b=5•运算符的结合性表见附录若已知赋值运算符的结合方向为自右向左,则a=b=5的解释为:运算量b的两侧均为=,而=的结合方向为右结合性,则b先和右边的=结合,于是b=5先进行,于是b的值为5,且表达式b=5的值也为5,下一步a=5,于是a的值为5。逗号运算符“,”的功能——依次计算,取最后一个值逗号运算符优先级最低(比赋值运算符还低)比较:x=a=3,b=5;x=(a=3,b=5);常规用法。t=a;a=b;b=t;逗号运算符格式:表达式1,表达式2,…,表达式nt=a,a=b,b=t;对下列日常写法的计算式,写出对应的C语言表达式:数学表达式翻译成C语言的表达式答案(1):4.0/3*3.1415926*r*r*r答案(2):(a+b)*0.5+fabs((a-b)*0.5)答案(3a):(-b+sqrt(b*b-4*a*c))/(2*a)(3b):(-b-sqrt(b*b-4*a*c))/(2*a)答案(4):exp(x+y)+log(a-b)/log(2)+pow(a+b,1.0/3)2.4不同类型数据间的转换C语言中允许不同类型的数据混合使用,但需要进行数据类型转换.类型转换的3种基本形式为:同一类型但长度不同的数据间的转换;定点方式与浮点方式之间的转换;整型数有符号与无符号格式之间的转换。1.几个概念•提升:由低级的数据类型转换为高级的数据类型。•降格:由高级的数据类型转换为低级的数据类型。•同一长度的整型数带/不带符号的转换属于同一级别。•符号位的扩展:将signed整型数提升为较长的signed型,在增加的长度中各个位的状态与原来较短的数据中的符号位相同。•零扩展:将unsigned型扩展为较长的整型数时,增加的位全部置0。•最高位符号功能的丢失与形成:10000000000000001000000000000000signed型unsigned型丢失形成•实数转换为整数(范围不越界)时,小数部分全部舍去。•double型转换为float型时,按“四舍五入”去除多余的有效数字。•舍去小数与四舍五入有可能丢失精度。•浮点数降格,即:doublefloat或double(float)long、short若数值超过了目标类型的取值范围,所得结果不确定。•较长的整型转换为较短的整型时,截去高位,保留低字节内容。因而会产生较大误差。1)整数相除舍去小数部分,如:5/3=1/*两个整数相除,结果的精度不会比整数更高*/-5/3=-12)若有一个数为实数,则结果为double型(因所有实数都按double型进行运算)。赋值表达式中类型的转换:其一般格式为:变量名=表达式;转换规则:“=”右边的值被转换为“=”左边变量所属的类型。若右边的数据类型级别较高(数据位较长),则进行截断或取舍。例如:inta;floatb=12.00;longc=64578987;/*3D965AB*/a=b+c;/*65ABH=26027D*/输出:a=26039.“=”两侧类型不一致时的转换:1)整型变量=实型数据,舍去小数部分。2)float变量=int数据,将int数据转换为float型。double变量=int数据,将int数据转换为double型。3)int变量=c型数据,因int型为2字节,c型为1字节,分下列两种情况:•系统将字符处理为无符号量,则字符数据(8位)放到int变量的低8位。•系统将字符处理为带符号的量时:字符最高位为0,处理方法同上;字符最高位为1,则int变量的高8位全补1(又称为字符扩展)。4)longint变量=int数据,同3)进行字符扩展。int变量=longint数据,只截取longint数据的低16位原封不动的送到int变量。如:inta;longintb=65536;a=b;则赋值后a=0。5)longint变量=unsignedint数据,无符号扩展,高位补0即可。6)将非unsigned型数据赋给长度相同的unsigned型变量时,连同符号位原样传送。[例]:类型转换main(){doublea=123456.789098765;floatb;longc;inti,j;b=a;c=a;i=a;j=c;printf(a=%lf,b=%f,c=%ld,i=%d,j=%d\n,a,b,c,i,j);}a=123456.789099b=123456.7890962c=123456i=-7616j=-76162.不同类型数据的转换•算术转换(运算符转换)目的:扩展短类型的数据,使运算符两端具有相同的类型。原则:doublefloatlongunsignedintchar,short高低例:50L+5*’a’-30.0longintcharfloat①int②longdouble③double强制类型转换(显式转换)强迫表达式的值转换为指定的数据类型。其一般格式为:(类型标识符)表达式;例如:(float)a;将变量a的值强迫转换为单精度数据类型。(int)(x+y);将(x+y)的值强迫转换为整数类型。注意:1)在强制类型转换中,产生一个中间变量,用于存放其转换后的数值;原变量(表达式)的数据类型不变。2)系统提供的数学函数一般要求参数为double型,在调用这些函数时,就可使用强制类型转换的方法。•输出转换以%d输出long型数据,相当于将long型转换为int型再输出。%u相当于将int型按无符号方式输出。注意:1)负数转换为无符号数时,符号位作为数值的一部分。[例]:类型转换main(){inti=-69;unsignedun=5;printf(%d+%u=%u?!\n,i,un,i+un);printf(%d+%u=%d\n,i,un,i+un);}-69+5=65472?!-69+5=-6465536-69=6546765467+5=654722)以较短类型输出较长类型数据时,高位丢失,若数据超出短类型范围,将产生较大误差。实数转换为整数时,仍然会产生这类错误。[例]:类型转换main(){inti,j;longa=80000,b=3200L;printf(%ld=%d?!\n,a,i=a);printf(%ld=%d?!\n,b,j=b);}80000=14464?!3200=

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功