C程序设计第4章数据类型及表达式.ppt

上传人:max****ui 文档编号:11544771 上传时间:2020-04-28 格式:PPT 页数:66 大小:546KB
返回 下载 相关 举报
C程序设计第4章数据类型及表达式.ppt_第1页
第1页 / 共66页
C程序设计第4章数据类型及表达式.ppt_第2页
第2页 / 共66页
C程序设计第4章数据类型及表达式.ppt_第3页
第3页 / 共66页
点击查看更多>>
资源描述
第4章数据类型及表达式,4.1数据结构4.2C语言程序中数据的表示方法4.3运算符及其表达式4.4C语言中的类型转换,4.1数据结构,数据结构是程序设计中计算机的操作对象以及操作对象之间关系和操作的描述。一个函数体中包括两大部分内容:其一是数据描述部分,其二是算法实现部分。要完成数据描述部分的内容,就必须寻找问题中的操作对象以及它们之间的关系,然后用计算机语言加以描述。,著名的计算机科学家沃斯(NikilausWirth)提出了公式:数据结构算法程序该公式表明除算法之外,一个程序中的数据结构是编写程序首先要解决的问题。例4.1中的“链表”、“树”和“图”就是数据结构中的重要类型。当然一个好的程序除了应该具备公式中两个主要因素外,还应该选择合适的程序设计语言和程序设计方法。C语言提供的数据结构是以数据类型形式表示的。,C语言提供了丰富的数据类型,主要有以下类型:,注:其中()括起来的是对应类型的类型关键字及该类型在内存中所占的字节数。,4.2C语言程序中数据的表示方法,数据是组成程序的必要元素,根据数据在程序中值的变化与否,数据在C语言程序中以常量和变量两种形式表示。,4.2.1常量1整型常量数据类型为整型的常量即为整型常量,又称整常数。在语言中,使用的整型常量有八进制、十六进制和十进制3种。其中八进制、十六进制主要用于表示整型常量在内存中的存储形式,也就是表示某整型常量的机器码;十进制表示外部数据,其值表示的是真值。,(1)八进制整型常量八进制整型常量必须以0开头,即以0作为八进制数的前缀。其数码取值为07。由于八进制数主要用于表示某整型常量的机器码,所以当表示某数机器码时,八进制数前面没有符号;如果有符号,则是对其所代表的真值取反。如0123,0123代表的真值为83,0123代表的常量则为83。,(2)十六进制整型常量十六进制整型常量的前缀为0X或0 x。其数码取值为09,AF或af。当十六进制数中出现af或AF时,数符码中出现字母时字母的大小写应和前缀相匹配,即要么全部大写,要么全部小写。十六进制数主要也是用于表示某整型常量的机器码,所以当表示某数机器码时,十六进制数前面没有符号;如果有符号,则是对其所代表的真值取反。如0 x23,0 x23代表的真值为35,0 x23代表的常量则为35。,(3)十进制整型常量十进制整型常量没有前缀。整型常量的几点说明如下。常量的类型常量的类型可以根据整型常量描述的数值来确定其类型。当整型常量的值为3276832767时,可以看作基本型整型常量。当整型常量的值为065535时,可以看作无符号整型常量。当整型常量的值在大于32767或小于32768时,可以看作长整型常量。,整型常数的后缀十进制无符号整型常量的范围为065535,有符号数为3276832767。八进制数表示的机器码范围为00177777。十六进制数表示的机器码范围为0X00XFFFF。如果希望将整型常量按照长整型常量来运算,可以使用长整型数的后缀“L”或“l”来表示。例如,十进制长整型常量158L358000L,2浮点常量实型也称为浮点型。实型常量也称为实数或者浮点数。实型常量不分单、双精度,都按双精度double型处理,其有效位数为1516位。,(1)小数形式小数形式由数码09和小数点组成。当某浮点数整数部分或小数部分为0时,0可以省略,但小数点不可省略。例如:0.0,.25,5.789,0.13,5.0,300.,267.8230,123.等均为合法的实数。345(无小数点),a7.(数码不可以是字母)等均为非法的浮点数。,(2)指数形式指数形式由尾数加阶码标志e或E以及阶码(只能为整数,可以带符号)组成。其一般形式为aEn(a为尾数,n为阶码)其值为a10n例如,2.1105可以表示为2.1E5,3.7可以表示为3.7E2,3单字符常量单字符常量是用单引号括起来的一个字符。单字符常量可以有如下几种表示方法。(1)直接形式直接形式即在单引号内直接书写字符。例如a、b、?(2)八进制形式八进制形式格式为ddd,其中“ddd”表示13位八进制数,其值代表的是某字符的ASCII值。“”是转义字符。八进制形式可以表示所有的字符。例如101(等于A),007(响铃控制字符),343(表示ASCII值为227的字符)。,(3)十六进制形式十六进制形式格式为xhh,其中“hh”表示12位十六进制数,其值代表的是某字符的ASCII值,“”是转义字符,“x”是十六进制前缀。十六进制形式可以表示所有的字符。例如x41(等于A),x07(响铃控制字符),xe3(表示ASCII值为227的字符)。(4)转义字符转义字符是一种特殊的字符常量。转义字符以反斜线“”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。,表4-5常用的转义字符,4字符串常量字符串常量是由一对双引号括起的字符序列,可以没有字符,也可以只有一个字符。例如,CHINA,Howareyou!,$12.5,A,nc234等都是合法的字符串常量。字符串program在内存存储的形式如图4.1所示。,该字符串占用8个字节的存储空间,但其有效字符的个数却是7,最后一个字节存储字符串结束标志“0”。,图4.1字符串存储形式,字符串的有效字符的个数是第一个“0”前字符的个数的总和,有效字符的个数也称为字符串长度。例如:computer长度为8。n长度为1。abcn3450china长度为5,而不是16,因为“0”后的字符是无意义的,“n”是一个转义字符,“345”是八进制表示的一个字符。长度为3,因为“”、“”与“”分别为一个字符。,5符号常量在语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为:#define标识符常量其功能是把该标识符定义为其后的常量值。,例4.2#definePI3.14159/*定义符号常量PI*/main()floatarea,r;/*定义area,r为float型变量*/r=5;/*使r的值为5*/area=PI*r*r;/*计算以r为半径的圆面积*/printf(area=%fn,area);/*输出圆面积*/,4.2.2变量1变量的基本知识在程序的执行过程中值可以发生变化的量称为变量。(1)变量的命名。变量的命名符合标识符的规定。变量名决定了某一变量在内存中的位置,即地址。如变量a的地址就是/*初始化变量a为5*/floatx=3.2,y=1.2e10;/*初始化x为3.2,y为1.2x1010*/charch=K;/*初始化ch为K*/intd=5;/*初始化d为5*/intb=d;/*初始化b为5,在intb=d;定义时d应有确定的值*/,4不同类型变量的说明(1)整型变量整型变量可分为基本型、短整型、长整型和无符号型4类。基本型基本型的类型说明符为int,在内存中占2个字节,其取值的范围为2152151,即3276832767。短整型短整型的类型说明符为shortint或short,所占字节和取值范围均与基本型相同。,长整型长整型的类型说明符为longint或long,在内存中占4个字节,其取值范围是2312311,即21474836482147483647。,无符号型无符号型的类型说明符为unsigned。无符号型又可与上述3种类型匹配而构成。无符号基本型。类型说明符为unsignedint或unsigned,取值范围是065535。无符号短整型。类型说明符为unsignedshort,与无符号基本型一样。无符号长整型。类型说明符为unsignedlongint或unsignedlong,取值范围为02321,即04294967295。,整型变量的说明形式为:修饰符int变量表列;(2)浮点变量浮点变量分为单精度浮点型和双精度浮点型两类。单精度浮点型类型说明符为float,双精度浮点型类型说明符为double。,浮点变量说明的格式为:float变量表列;或double变量表列;例如:floatx,y;/*定义x,y为单精度浮点型*/doublea,b,c;/*定义a,b,c为双精度浮点型*/floatx=1234.56789;/*定义x为单精度浮点型,并初始化值为1234.567*/,(3)字符型变量字符型变量的取值是字符型数据。字符型变量的类型说明符是char。字符型变量类型说明的格式:char变量表列;例如:charc1,c2;/*定义c1,c2为字符型*/,4.3运算符及其表达式,4.3.1C运算符概述运算是对数据进行加工的过程,描述各种不同运算的符号称为运算符。参加运算的数据称为运算对象或操作数。用运算符和括号将运算对象连接起来的符合C语言语法规则的式子称为C语言表达式。语言的运算符不仅具有不同的优先级,而且还有结合性的特性。表达式中各运算对象参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定运算符是和左侧的运算对象结合,还是和右侧的运算对象结合。,4.3.2算术运算符及算术表达式,1算术运算符C语言提供了5个基本的算术运算符:加法运算符-减法运算符,负号运算符*乘法运算符/除法运算符%取余运算符或称模运算符运算符,的优先级相同,*,/,%的优先级相同,*,/,%的优先级高于和运算符,算术运算符都是左结合的运算符。,2算术表达式用算术运算符和括号运算符将运算对象连接起来的符合C语言规则的式子,称为算术表达式。算术表达式的计算符合运算符优先级和结合性的原则。计算表达式时的具体过程是:对表达式自左向右扫描运算对象,然后考察运算对象两侧的运算符。如果优先级不相同,则该运算对象和高优先级的运算符结合,当某运算符所需的运算对象全部都和该运算符结合后进行运算,运算后的结果就是下一个被处理的运算对象,否则继续扫描下一个运算对象;如果两侧的运算符优先级相同,则按照运算符的结合性原则去结合运算。如果运算符是左结合的,则和左侧的运算符结合,如果是右结合的,则和右侧的运算符结合。,例如,表达式a+b*5/6/*假定a=3,b=1*/,图4.3表达式计算过程,4.3.3自增自减运算符及含自增自减表达式C语言中提供了两个特殊的运算符,自增运算符和自减运算符。它们都是单目运算符,运算对象可以位于运算符前面,也可以位于运算符后面。当运算符位于运算对象前面时,称为前缀运算符,如i和i;当运算符位于运算对象后面时,称为后缀运算符,如i和i。自增自减运算符的功能是将运算对象加1或减1后,再将结果保存到运算对象中去,如i等同于ii1。自增自减运算符的运算对象只能是变量。,当表达式中出现自增自减运算符时,表达式的求值过程如下。(1)自增自减运算符是后缀运算符时,应先使用自增自减运算符的运算对象计算整个表达式的值,然后再计算自增自减。例4.4main()inti=2,j=3;intk;k=(i+)+(j+)+4;printf(result:k=%d,i=%d,j=%dn,k,i,j);程序运行结果为:result:k=9,i=3,j=4表达式k(i)(j)4的运算可理解为:先运算表达式kij4,再计算i和j。,(2)自增自减运算符是前缀运算符时,应先完成自增自减,然后使用运算后的结果计算整个表达式的值。例4.5main()inti=2,j=3;intk;k=(+i)+(+j)+4;printf(result:k=%d,i=%d,j=%dn,k,i,j);,result:k=11,i=3,j=4表达式k(i)(j)4的运算可理解为:先运算i和j,再计算表达式kij4。,程序运行结果为:,(3)当表达式中既含有后缀自增自减运算符,又含有前缀自增自减运算符时,应先计算所有的前缀自增自减运算,再计算整个表达式的值,最后计算所有的后缀自增自减运算。例4.6main()inti=2,j=3;intk;k=(i+)+(j+)+4+(+i)+(+j);printf(result:k=%d,i=%d,j=%dn,k,i,j);,程序运行结果为:result:k=18,i=4,j=5表达式k(i)(j)4(i)(j)的运算可理解为:先运算i和j,再计算表达式kij4ij,最后计算i和j。注意:在运算的时候变量i,j是变化的,但在某瞬间值是确定的。,1简单的赋值运算符和赋值表达式C语言的赋值运算符是“”,该运算符是双目运算符,它的优先级仅高于逗号运算符,是右结合性的。由赋值运算符构成的赋值表达式的格式为:变量确定的值赋值表达式会得到两个值。一个是赋值运算符左侧变量的值;另一个是赋值表达式的值,表达式的值与变量的值是相同的。,4.3.4赋值运算符和赋值表达式,下列表达式是合乎C语言表达式规则的表达式:a=123a=123.456c=a+Ax=a+ca+(x=a+4)/c/*算术表达式*/(x=a)+(b=3)/*合法的算术表达式*/,2复合的赋值运算符和复合的赋值表达式在赋值运算符“”前加上其他的运算符,可以构成复合的赋值运算符。如在“”前加上“”运算符就构成了“”运算符。C语言提供了10种复合的赋值运算符,它们是+=,-=,*=,=,%=,=,y=(x=a+b),(b+c);printf(y=%d,x=%d,y,x);程序运行结果为:y=6,x=6本例中的y等于6,而逗号表达式的值y(xab),(bc)是10。,4.3.6表达式小结判断表达式类型应根据表达式中出现的运算符的优先级来判定。如果某一运算符在整个表达式的运算过程中优先级是最低的,或者是最后运算的运算符,那么表达式的类型就是该运算符所从属的类型。例如:x=(a=3,b*3)是赋值表达式;x=a=3,6*a是逗号表达式;(x=8)(y=9)+6是关系表达式;(k=i+)/3*a是算术表达式。,4.4C语言中的类型转换,C语言规定不同类型的数据不能够直接进行运算,只有相同类型的数据才可以。但是在描述表达式时,参与运算的运算对象却可以是不同类型的数据,于是在表达式进行运算的时候存在类型的转换问题。C语言中有两种形式的类型转换。,4.4.1类型的自动转换1赋值表达式中的类型转换其转换的依据是将赋值运算符右侧的确定的值按照左侧变量定义的类型存储,即要把确定的值转换为变量定义的类型。为了方便描述,以下所有的示例都假定有如下的变量说明:inta;longintb;unsignedintc;floatx;charc1;,(1)浮点型数据赋给整型变量浮点型数据赋给整型变量转换的方法是舍去浮点型数据的小数部分,将整数部分赋给整型变量。(2)整型数据赋给浮点型变量整型数据赋给浮点型变量转换的方法是数值保持不变,只是将整型数据以浮点型数据的存储形式存储到相应的浮点变量中。,(3)字符型数据赋给整型变量具体转换的方法是将字符型数据的ASCII码存储到整型变量的低字节中,整型变量的高字节的所有位存储的是低字节的“高位扩展”。如果低字节的最高位为0,则高字节的所有位全部扩展为;如果低字节的最高位为1,则高字节的所有位全部扩展为。例如:c1=A,a=c1整型变量a的值为65。字符型数据c1和整型变量a的存储如图4.4所示。,图4.4变量c1,a的存储,(4)整型数据赋给字符型变量整型数据赋给字符型变量时的具体转换方法是将整型数据的低字节存储的内容存储到字符型变量中去,即“高位截断”。例如:c1=254运算后c1的ASCII码值为254。字符型变量c1,整型常量254的存储如图4.6所示。,图4.6变量c1,常量254的存储,(5)int型数据赋给longint型变量int型数据赋给longint型变量时,具体转换的方法是将int型数据的值存储到longint变量的低字中。,图4.8变量a,b的存储,(6)longint型数据赋给int型或unsignedint型变量具体转换的方法是将longint型数据的低字的内容存储到int型或unsignedint型变量中去。,图4.10变量b,a和c的存储,(7)unsignedint型数据赋给longint型变量具体转换的方法是将unsignedint型数据的值存储到longint型变量的低字中,longint型变量的高字的所有位存储的是。,(8)相同长度的整型数据赋给相同长度的整型变量相同长度的整型数据赋给相同长度的整型变量转换的规则是存储形式不发生变化,但代表的真值不一定相同。,2不同类型数据的混合运算当某一运算符两侧的运算对象类型不相同时,应进行类型转换,转换的依据是低类型转换为高类型。类型的高低是相对于某类型的数据在内存中所占的字节数而言的,占字节数少的数据类型就低,占字节数多的数据类型就高。在所有的数据类型中,字符型数据的类型是最低的,双精度浮点型的类型是最高的。,C语言规定在运算时char数据必须转换为int型,float型数据必须转换为double型参与运算。float型数据转换为double型的主要目的是为了提高运算的精度,因为double型提供的有效位数多于float型。这种情况下的类型转换称为必然的转换。当类型不相同的数据参与运算时,应该将低类型的数据转换为高类型的数据,类型的高低依次是intunsignedintlongunsignedlongintdouble。这种情况下的转换称为可能的转换。低类型转化为高类型的转化规则按照赋值表达式转化规则转换。,例如,某函数的数据描述部分有:inta=3;longintb=10;floatx=4.2;则表达式a+a*b-373*x的运算次序及类型转换情况为:先计算a*b,将a转换为整型数97,运算结果为970;再运算a970,不存在类型转换,运算结果为973;然后运算373*x,373必然转换为整型5(读者自己分析原因),x必然转化为双精度浮点型,5和x类型不相同,存在可能的转换,将5转换为双精度浮点型5.0,运算结果为21.0;最后计算97321.0,存在可能的转换,将973转换为双精度浮点型973.0,运算结果为952.0。表达式的结果为952.0,是双精度浮点型。,4.4.2强制的类型转换当自动的类型转换不能达到目的时,可以使用强制类型转换的方法。强制类型转换是通过类型转换运算来实现的。类型转换运算符是:(类型符)强制转换表达式的一般形式为:(类型符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。,例如:(float)a/*把a代表的值转换为实型*/(int)(x+y)/*把x+y的结果转换为整型*/(int)x+y/*把x的值转换为int型,再和y相加*/(int)x%5/*把x的值转换为int型,再和5取余*/,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!