ImageVerifierCode 换一换
格式:PPTX , 页数:121 ,大小:692.22KB ,
资源ID:13190260      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/13190260.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(第3章 数据类型、运算符与表达式.pptx)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

第3章 数据类型、运算符与表达式.pptx

1、单击此处编辑母版标题样式,单击此处编辑母版副标题样式,3.1 C,的数据类型,3.2,常量与变量,3.3,整型数据,3.4,实型数据,3.5,字符型数据,3.6,变量赋初值,第,3,章 数据类型、运算符与表达式,3.7,各类数值型数据间的混合运算,3.8,算术运算符和算术表达式,3.9,赋值运算符和赋值表达式,3.10,逗号运算符和逗号表达式,习题,3.1 C,的数据类型,一个程序应包括以下两方面内容:,(1),对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构,(data structure),。,(2),对操作的描述。即操作步骤,也就是算法,(algorithm),。,据是

2、操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。打个比方,厨师做菜肴,需要有菜谱。菜谱上一般应包括:,配料,指出应使用哪些原料;操作步骤,指出如何使用这些原料按规定的步骤加工成所需的菜肴。面对同一些原料可以加工出不同风味的菜肴。,作为程序设计人员,必须认真考虑和设计数据结构和操作步骤,(,即算法,),。因此,著名计算机科学家沃思,(nikiklaus Wirth),提出一个公式数据结构,+,算法,=,程序实际上,一个程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。因此,可以这样表示:,程序,=,算法,+,数据结构,+,程序设计方

3、法,+,语言工具和环境,也就是说,以上,4,个方面是一个程序设计人员所应具备的知识。在设计一个程序时要综合运用这几方面的知识。在本书中不可能全面介绍这些内容,它们都属于有关的专门课程范畴。在这,4,个方面中,算法是灵魂,数据结构是加工对象,语言是工具,编程需要采用合适的方法。算法是解决“做什么”和“怎么做”的问题。程序中的操作语句,实际上就是算法的体现。算法处理的对象是数据,而数据是以某种特定的形式存在的,(,例如整数、实数、字符等形式,),。不同的数据之间往往还存在某些联系,(,例如由若干个整数组成一个整数数组,),。所谓数据结构指的是数据的组织形式。例如,数组就是一种数据结构。不同的计算机

4、语言所允许定义,和使用的数据结构是不同的。例如,,c,语言提供了“结构体”这样一种数据结构,而,fortran,语言就不提供这种数据结构。处理同一类问题,如果数据结构不同,算法也会不同。例如,对,10,个整数排序和对由,10,个整数构成的数组排序的算法是不同的。因此,在考虑算法时,必须注意数据结构。实际上,应当综合考虑算法和数据结构,选择最佳的数据结构和算法。,C,语言的数据结构是以数据类型形式出现的。,c,的数据类型如下,:,数据类型,基本类型,整型,字符型,实型,(,浮点型,),单精度型,双精度型,枚举类型,构造类型,数组类型,结构体类型,共用体类型,指针类型,,空类型,C,语言中数据有常

5、量与变量之分,它们分别属于以上这些类型。由以上这些数据类型还可以构成更复杂的数据结构。例如利用指针和结构体类型可以构成表、树、栈等复杂的数据结构。在程序中对用到的所有数据都必须指定其数据类型。在本章中主要介绍基本数据类型。,3.2,常量与变量,3.2.1,常量和符号常量,在程序运行过程中,其值不能被改变的量称为常量。常量区分为不同的类型,如,12,,,0,,,-3,为整型常量,,4.6,、,-1.23,为实型常量,,a,,,d,为字符常量。常量一般从其字面形式即可判别。这种常量称为字面常量或直接常量。,也可以用一个标识符代表一个常量,如,:,例,3.1,符号常量的使用。,#define pri

6、ce 30,main(),int num,,,total;,num=10;,total=num*price;,printf(total=%d,,,total);,程序中用,#define,命令行定义,price,代表常量,30,,此后凡在本文件中出现的,price,都代表,30,,可以和常量一样进行运算,程序运行结果为,total=300,有关,#define,命令行的详细用法参见第,8,章。,这种用一个标识符代表一个常量的,称为符号常量,即标识符形式的常量。请注意符号常量不同于变量,它的值在其作用域,(,在本例中为主函数,),内不能改变,也不能再被赋值。如再用以下赋值语句给,price,赋值

7、是错误的。,price=40;,习惯上,符号常量名用大写,变量用小写,以示区别。,使用符号常量的好处是:,(1),含义清楚。如上面的程序中,看程序时从,price,就可知道它代表价格。因此定义符号常量名时应考虑“见名知意”。在一个规范的程序中不提倡使用很多的常数,如:,sum=15*30*23.5*43,。在检查程,序时搞不清各个常数究竟代表什么。应尽量使用“见名知意”的变量名和符号常量。,(2),在需要改变一个常量时能做到“一改全改”。例如在程序中多处用到某物品的价格,如果价格用常数表示,则在价格调整时,就需要在程序中作多处修改,若用符号常量,price,代表价格,只需改动一处即可。如:,#

8、define price 35,在程序中所有以,price,代表的价格就会一律自动改为,35,。,3.2.2,变量,其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。请注意区分变量名和变量值这两个不同的概念,见图,3.1,。变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。和其他高级语言一样,用来标识变量名、,图,3.1,符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为标识符,(identifier),。简单地

9、说,标识符就是一个名字。,C,语言规定标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。下面列出的是合法的标识符,也是合法的变量名:,sum,,,average,,,-total,,,class,,,day,,,month,,,student-name,,,tan,,,lotus-1-2-3,,,basic,,,li-ling,下面是不合法的标识符和变量名:,d,ohn,,,y 123,,,33,,,3d64,,,ab,注意,大写字母和小写字母被认为是两个不同的字符。因此,,sum,和,suM,,,class,和,class,是两个不同的变量名。一般,变量名用小写字母

10、表示,与人们日常习惯一致,以增加可读性。,ANSI C,标准没有规定标识符的长度,(,字符个数,),,但各个,c,编译系统都有自己的规定。有的系统,(,如,ib,PC,的,s C),取,8,个字符,假如程序中出现的变量名长度大于,8,个字符,则只有前面,8,个字符有效,后面的不被识别。例如,有两个变量:,student_name,和,student_number,,由于二者的前,8,个字符相同,系统认为这两个变量是一回事而不加区别。可以将它们改为,stud_name,和,stud_num,,以使之区别。,Turbo C,则允许,32,个字符。因此,在写程序时应了解所用系统对标识符长度的规定,以

11、免出现上面的混淆。这种错误并不反映在编译过程中,(,即语法无错误,),,但运行结果显然不对。为了程序的可移植性,(,即在甲机器上运行的程序可以基本上不加修改,就能移到乙机器上运行,),以及阅读程序的方便,建议变量名的长度不要超过,8,个字符。,如前所述,在选择变量名和其他标识符时,应注意做到“见名知意”,即选有含意的英文单词,(,或其缩写,),作标识符,如,count,、,name,、,day,、,month,、,total,、,country,等,除了数值计算程序外,一般不要用代数符号,(,如,a,、,b,、,c,、,x1,、,y1,等,),作变量名,,以增加程序的可读性。这是结构化程序的一

12、个特征。本书在一些简单的举例中,为方便起见,仍用单字符的变量,?,如,a,、,b,、,c,等,),,请读者注意不要在其他所有程序中都如此。,在,c,语言中,要求对所有用到的变量作强制定义,也就是“先定义,后使用”,如例,1,2,、例,1,3,那样。这样做的目的是:,(1),凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。例如,如果在定义部分写了,int student;,而在执行语句中错写成,staent,。如:,staent=30,;,在编译时检查出,statent,未经定义,不作为变量名。因此输出“变量,statent,未经声明”的信息,便于用户发现错误,避免变量名使用时

13、出错。,(2),每一个变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。如指定,a,、,b,为,int,型,,turbo c,编译系统为,a,和,b,各分配两个字节,并按整数方式存储数据。,(3),指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。例如,整型变量,a,和,b,,可以进行求余运算:,a%b,%,是“求余”,(,见,3.8,节,),,得到,a/b,的余数。如果将,a,、,b,指定为实型变量,则不允许进行“求余”运算,在编译时会给出有关“出错信息”。,下面各节分别介绍整型、实型,(,浮点型,),、字符型数据。,3.3,整型数据,3.3.1,整型

14、常量的表示方法,整型常量即整常数。,c,整常数可用以下三种形式表示:,(1),十进制整数。如,123,,,-456,,,0,。,(2),八进制整数。以,0,开头的数是八进制数。如,0123,表示八进制数,123,,即,(123),8,,其值为:,18,2,+28,1,+38,0,,等于十进制数,8 3,。,-011,表示八进制数,-11,,即十进制数,-9,。,(3),十六进制整数。以,0 x,开头的数是十六进制数。如,0 x123,,代表十六进制数,123,,即,(123)16=116,2,+216,1,+316,0,=256+32+3=291,。,-0 x12,等于十进制数,-18,。,3

15、3.2,整型变量,1.,整型数据在内存中的存放形式数据在内存中是以二进制形式存放的。,如果定义了一个整型变量,i,:,int i;/*,定义为整型变量*,/,i=10;/*,给,i,赋以整数,10*/,十进制数,10,的二进制形式为,1010,,在微机上使用的,c,编译系统,每一个整型变量在内存中占,2,个字节。图,3.2(a),是数据存放的示意图。图,3.2(b),是数据在内存中实际存放的情况。,图,3.2,实际上,数值是以补码,(complement),表示的。一个正数的补码和其原码的形式相同。图,3.2(b),就是用补码形式表示的。如果数值是负的,在内存中如何用补码形式表示呢,?,求负

16、数的补码的方法是:将该数的绝对值的二进制形式,按位取反再加,1,。例如求,-10,的补码:取,-10,的绝对值,10,;,10,的绝对值的二进制形式为,1010,;对,1010,取反得,1111111111110101(,一个整数占,16,位,),;再加,1,得,1111111111110110,,见图,3.3,。,图,3.3,可知整数的,16,位中,最左面的一位是表示符号的,该位为,0,,表示数值为正;为,1,则数值为负。,关于补码的知识不属于本书的范围,但学习,c,语言的读者应该比学习其他高级语言的读者对数据在内存中的表示形式有更多的了解。这样才能理解不同类型数据间转换的规律。在本章稍后的

17、叙述中还要接触到这方面的问题。,2.,整型变量的分类,整型变量的基本类型符为,int,。可以根据数值的范围将变量定义为基本整型、短整型或长整型。在,int,之前可以根据需要分别加上修饰符,(modifier):short(,短型,),或,long(,长型,),。因此有以下三种整型变量:,(1),基本整型,以,int,表示。,(2),短整型,以,short int,表示,或以,short,表示。,(3),长整型,以,long int,表示,或以,long,表示。,在,turbo c,中一个,int,型的变量的值范围为,-2,15,(2,15,-1),,即,-32768,32767,。在实际应用中

18、变量的值常常是正的,(,如学号、库存量、年龄、存,款额等,),。为了充分利用变量的表数范围,此时可以将变量定义为“无符号”类型。对以上三种都可以加上修饰符,unsigned,,以指定是“无符号数”。如果加上修饰符,signed,,则指定是“有符号数”。如果既不指定为,signed,,也不指定为,unsigned,,则隐含为有符号,(signed),。实际上,signed,是完全可以不写的。归纳起来,可以用以下,6,种整型变量。即:,有符号基本整型,signed int,无符号基本整型,unsigned int,有符号短整型,signed short int,无符号短整型,unsigned s

19、hort int,有符号长整型,signed long int,无符号长整型,unsigned long int,如果不指定,unsigned,或指定,signed,,则存储单元中最高位代表符号,(0,为正,,1,为负,),。如果指定,unsigned,,为无符号型,存储单元中全部二进位,(bit),用作存放数本身,而不包括符号。无符号型变量只能存放不带符号的整数,如,123,、,4687,等,而不能存放负数,如,-123,、,-3,。一个无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。如果在程序中定义,a,和,b,两个变量,:,int a;,unsigned int

20、b;,则变量,a,的数值范围为,-32768,32767,。而变量,b,的数值范围为,0,65535,。,图,3.4(a),表示有符号整型变量,a,的最大值,(32767),。图,3.4(b),表示无符号整型变量,b,的最大值,(65535),。,图,3.4,C,标准没有具体规定以上各类数据所占内存字节数,只要求,long,型数据长度不短于,int,型,,short,型不长于,int,型。具体如何实现,由各计算机系统自行决定。如在微机上,,int,和,short,都是,16,位,而,long,是,32,位。在,Vax 750,上,,short,是,16,位,而,int,和,long,都是,32

21、位,一般以一个机器字,(word),存乓桓鰅,nt,数据。前一阶段,微机的字长一般为,16,位,故以,16,位存放一个整数,但整数的范围太小,往往不够用,故将,long,型定为,32,位。而,Vax,的字长为,32,位,以,32,位存放一个整数,范围可达正负,21,亿,已足够用了,不必再将,long,型定为,64,位。所以将,int,和,long,都定为,32,位。通常的做法是:把,long,定为,32,位,把,short,定为,16,位,而,int,可以是,16,位,也可以是,32,位。这主要取决于机器字长。在微机上用,long,型可以得到大范围的整数,但同时会降低运算速度,因此除非不得已

22、不要随便使用,long,型。,方括弧内的部分是可以省写的。例如,signed short int,与,short,等价,尤其是,signed,是完全多余的,一般都不写,signed,。一个整数,(,以,13,为例,),在存储单元中的存储情况,见图,3.5,所示,(,假设使用的是微机上的,c,编译系统,如,turbo,、,Ms,)。,图,3.5,3.,整型变量的定义,前面已提到,,c,规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。这是和,basic,、,fortran,不同的,而和,pascal,相类似。例如:,int a,,,b,;,(,指定变量,a,、,b,为整型,),

23、unsigned short c,,,d,;,(,指定变量,c,、,d,为无符号短整型,),long e,,,f,;,(,指定变量,e,、,f,为长整型,),对变量的定义,一般是放在一个函数的开头部分的声明部分,(,也可以放在函数中某一分程序内,但作用域只限它所在的分程序,这将在第,6,章介绍,),。,例,3.2,整型变量的定义与使用。,main(),int a,,,b,,,c,,,d;/*,指定,a,、,b,、,c,、,d,为整型变量*,/,unsigned u,;,/*,指定,u,为无符号整型变量*,/,a=12,;,b=-24,;,u=10,;,c=a+u,;,d=b+u,;,print

24、f(a+u=%d,,,b+u=%dn,,,c,,,d),;,运行结果为,a+u=22,,,b+u=-14,可以看到不同种类的整型数据可以进行算术运算。在本例中是,int,型数据与,unsigned int,型数据进行相加相减运算,(,有关运算的规则在本章,3.7,节中介绍,),。,4.,整型数据的溢出,在,turbo c,中一个,int,型变量的最大允许值为,32767,,如果再加,1,,会出现什么情况,?,例,3.3,整型数据的溢出。,main(),int a,,,b;,a=32767;,b=a+1;,printf(%d,,,%d,,,a,,,b);,运行结果为,32767,,,-32768

25、图,3.6,从图,3.6,可以看到:变量,a,的最高位为,0,,后,15,位全为,1,。加,1,后变成第,1,位为,1,,后面,15,位全为,0,。而它是,-32768,的补码形式,所以输出变量,b,的值为,-32768,。请注意:一个整型变量只能容纳,-32768,32767,范围内的数,无法表示大于,32767,的数。遇此情况就发生“溢出”,但运行时并不报错。它好像汽车的里程表一样,达到最大值以后,又从最小值开始计数。所以,,32767,加,1,得不到,32768,,而得到,-32768,,这可能与程序编制者的原意不同。从这里可以看到:,c,的用法比较灵活,往往出现副作用,而系统又不给出

26、出错信息”,要靠程序员的细心和经验来保证结果的正确。将变量,b,改成,long,型就可得到预期的结果,32768,。,3.3.3,整型常量的类型,我们已知整型变量可分为,int,、,short int,、,long int,和,unsigned int,、,unsigned short,、,unsigned long,等类别。那么常量是否也有这些类别,?,在将一个整型常量赋值给上述几种类别的整型变量时如何做到类型匹配,?,请注意以下几点:,(1),一个整数,如果其值在,-32768,+32767,范围内,认为它是,int,型,它可以赋值给,int,型和,long int,型变量。,(2),一

27、个整数,如果其值超过了上述范围,而在,-2147483648,+2147483647,范围内,则认为它是长整型,可以将它赋值给一个,long int,型变量。,(3),如果某一计算机系统的,c,版本,(,例如,turbo c),确定,short int,与,int,型数据在内存中占据的长度相同,则它的表数范围与,int,型相同。因此,一个,int,型的常量也同时是一个,short int,型常量,可以赋给,int,型或,short int,型变量。,(4),一个整常量后面加一个字母,u,,认为是,unsigned int,型,如,12345u,,在内存中按,unsigned int,规定的方式

28、存放,(,存储单元中最高位不作为符号位,而用来存储数据,见图,3.4(b),。如果写成,-12345u,,则先将,-12345,转换成其补码,53191,,然后按无符号数存储。,(5),在一个整常量后面加一个字母,l,或,l,,则认为是,long int,型常量。,例如,123l,、,432l,、,0l,等,这往往用于函数调用中。如果函数的形参为,long int,型,则要求实参也为,long int,型,此时用,123,作实参不行,而要用,123l,作实参。,3.4,实型数据,3.4.1,实型常量的表示方法,实数,(real number),又称浮点数,(floating-point num

29、ber),。实数有两种表示形式:,(1),十进制小数形式。它由数字和小数点组成,(,注意必须有小数点,),。,.123,、,123.,、,123.0,、,0.0,都是十进制小数形式。,(2),指数形式。如,123e3,或,123e3,都代表,12310,3,。但注意字母,e(,或,e),之前必须有数字,且,e,后面的指数必须为整数,如,e3,、,2.1e3.5,、,e3,、,e,等都不是合法的指数形式。,一个实数可以有多种指数表示形式。例如,123.456,可以表示为,123.456e0,,,12.3456e1,、,1.23456e2,、,0.123456e3,、,0.0123456e4,、,

30、0.00123456e5,等。把其中的,1.23456e2,称为“规范化的指数形式”,即在字母,e(,或,e),之前的小数部分中,小数点左边应有一位,(,且只能有一位,),非零的数字。例如,2.3478e2,、,3.0999e5,、,6.46832e12,都属于规范化的指数形式,而,12.908e10,、,0.4578e3,、,756e0,则不属于规范化的指数形式。一个实数在用指数形式输出时,是按规范化的指数形式输出的。例如,指定将实数,5689.65,按指数形式输出,必然输出,5.68965e+003,,而不会是,0.568965e+004,或,56.8965e+002,。,1.,实型数据在

31、内存中的存放形式,在常用的微机系统中,一个实型数据在内存中占,4,个字节,(32,位,),。与整型数据的存图,3.7,储方式不同,实型数据是按照指数形式存储的。系统把一个实型数据分成小数部分和指数部分,分别存放。指数部分采用规范化的指数形式。实数,3.14159,在内存中的存放形式可以用图,3.7,示意。,3.4.2,实型变量,图,3.7,图中是用十进制数来示意的,实际上在计算机中是用二进制数来表示小数部分以及用,2,的幂次来表示指数部分的。在,4,个字节,(32,位,),中,究竟用多少位来表示小数部分,多少位来表示指数部分,标准,C,并无具体规定,由各,C,编译系统自定。不少,c,编译系统以

32、24,位表示小数部分,(,包括符号,),,以,8,位表示指数部分,(,包括指数的符号,),。小数部分占的位,(bit),数愈多,数的有效数字愈多,精度愈高。指数部分占的位数愈多,则能表示的数值范围愈大。,2.,实型变量的分类,C,实型变量分为单精度,(float,型,),、双精度,(double,型,),和长双精度型,(long double),三类。,ANSI C,并未具体规定每种类型数据的长度、精度和数值范围。有的系统将,double,型所增加的,32,位全用于存放小数部分,这样可以增加数值的有效位数,减少舍入误差。有的系统则将所增加的位,(bit),用于存放指数部分,这样可以扩大数值的

33、范围。表,3.2,列出的是微机上常用的,c,编译系统,(,如,turbo c,,,Ms c,,,borland c),的情况。应当了解,不同的系统会有差异。,对每一个实型变量都应在使用前加以定义。如,:,float,x,,,y,,,(,指定,x,、,y,为单精度实数,),double z,;,(,指定,z,为双精度实数,),long double t;(,指定,t,为长双精度实数,),在初学阶段,对,long double,型用得较少,因此我们不准备作详细介绍。读者只要知道有此类型即可。,3.,实型数据的舍入误差,由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以

34、外的数字将被舍去。由此可能会产生一些误差。例如,,a,加,20,的结果显然应该比,a,大。请分析下面的程序:,例,3.4,实型数据的舍入误差。,main(),float a,,,b;,a=123456,789e5;,b=a+20;,printf(%f,,,b);,程序内,printf,函数中的“,%f”,是输出一个实数时的格式符。程序运行时,输出,b,的值与,a,相等。原因是:,a,的值比,20,大很多,,a+20,的理论值应是,12345678920,,而一个实型变量只能保证的有效数字是,7,位有效数字,后面的数字是无意义的,并不准确地表示该数。,运行程序得到的,a,和,b,的值是,1234

35、5678848.000000,,可以看到,,?,位是准确的,后几位是不准确的,把,20,加在后几位上,是无意义的。应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。与此类似,用程序计算,1.0/3*3,的结果并不等于,1,。,3.4.3,实型常量的类型,C,编译系统将实型常量作为双精度来处理。例如已定义一个实型变量,f,,有如下语句:,f=2.45678*4523.65,系统将,2.45678,和,4523.65,按双精度数据存储,(,占,64,位,),和运算,得到一个双精度的乘积,然后取前,7,位赋给实型变量,f,。这样做可以保证计算结果更精确,但是运算速度降低了。

36、可以在数的后面加字母,f,或,f(,如,1.65f,,,654.87f),,这样编译系统就会按单精度,(32,位,),处理。一个实型常量可以赋给一个,float,型、,double,型或,long double,变量。根据变量的类型截取实型常量中相应的有效位数字。假如,a,已指定为单精度实型变量:,float a,;,a=111111,111,;,由于,float,型变量只能接收,7,位有效数字,因此最后两位小数不起作用。如果,a,改为,double,型,则能全部接收上述,9,位数字并存储在变量,a,中。,3.5,字符型数据,3.5.1,字符常量,C,的字符常量是用单引号,(,即撇号,),括起

37、来的一个字符。如,a,,,x,,,d,,,?,,等都是字符常量。注意,,a,和,a,是不同的字符常量。,除了以上形式的字符常量外,,C,还允许用一种特殊形式的字符常量,就是以一个“,”,开头的字符序列。例如,前面已经遇到过的,在,printf,函数中的,n,,它代表一个“换行”符。这是一种“控制字符”,在屏幕上是不能显示的。在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示。,例,3.5,转义字符的使用。,ain(),printf(ab ct derftgn);,printf(htibbj k);,程序中没有设字符变量,用,printf,函数直接输出双引号内的各个字符。,请注意其中

38、的“转义字符”。第一个,printf,函数先在第一行左端开始输出“,ab c”,,然后遇到“,t”,,它的作用是“跳格”,即跳到下一个“制表位置”,在我们所用系统中一个“制表区”占,8,列。“下一制表位置”从第,9,列开始,故在第,9,11,列上输出“,de”,。,下面遇到“,r”,,它代表“回车”,(,不换行,),,返回到本行最左端,(,第,1,列,),,输出字符“,f”,,然后遇“,t”,再使当前输出位置移到第,9,列,输出“,g”,。下面是“,n”,,作用是“使当前位置移到下一行的开头”。第二个,printf,函数先在第,1,列输出字符“,h”,,后面的“,t”,使当前位置跳到第,9,列

39、输出字母“,i”,,然后当前位置应移到下一列,(,第,10,列,),准备输出下一个字符。下面遇到两个“,b”,,“,b”,的作用是“退一格”,因此“,bb”,的作用是使当前位置回退到第,8,列,接着输出字符“,j k”,。,程序运行时在打印机上得到以下结果:,fab c gde,h jik,注意在显示屏上最后看到的结果与上述打印结果不同,是:,f gde,h j k,这是由于“,r”,使当前位置回到本行开头,自此输出的字符,(,包括空格和跳格所经过的位置,),将取代原来屏幕上该位置上显示的字符。所以原有的“,ab c ”,被新的字符“,f g”,代替,其后的“,de”,未被新字符取代。换行后

40、先输出“,h i”,,退两格,后再输出“”,后面的“”将原有的字符“,i”,取而代之。因此屏幕上看不到“,i”,。实际上,屏幕上完全按程序要求输出了全部的字符,只是因为在输出前面的字符后很快又输出后面的字符,在人们还未看清楚之前,新的已取代了旧的,所以误以为未输出应输出的字符。而在打印机输出时,不像显示屏那样会“抹掉”原字符,留下了不可磨灭的痕迹,它能真正反映输出的过程和结果。,3.5.2,字符变量,字符型变量用来存放字符常量,请注意只能放一个字符,不要以为在一个字符变量中可以放一个字符串,(,包括若干字符,),。字符变量的定义形式如下:,char,c1,,,c2,;,它表示,c1,和,c2,

41、为字符型变量,各可以放一个字符,因此在本函数中可以用下面语句对,c1,、,c2,赋值:,c1=a,;,c2=b,;,在所有的编译系统中都规定以一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。,3.5.3,字符数据在内存中的存储形式及其使用方法,将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的,ASCII,代码放到存储单元中。例如字符,a,的,ASCII,代码为,97,,,b,为,98,,在内存中变量,c1,、,c2,的值如图,3.8(a),所示。实际上是以二进制形式存放的,如图,3.8(b),所示。,图,3.8,既然在内存中,字符数

42、据以,ASCII,码存储,它的存储形式就与整数的存储形式类似。这样,在字符型数据和整型数据之间的转换就比较方便了。一个字符数据既可以以字符形式输出,也可以以整数形式输出。以字符形式输出时,需要先将存储单元中的,ASCII,码转换成相应字符,然后输出。以整数形式输出时,直接将,ASCII,码作为整数输出。也可以对字符数据进行算术运算,此时相当于对它们的,ASCII,码进行算术运算,只是将其一个字节转化为,29,字节,然后参加运算。,例,3.6,向字符变量赋以整数。,main(),char c1,,,c2;,c1=97;,c2=98;,printf(%c%cn,,,c1,,,c2);/*,以字符形

43、式输出*,/,printf(%d%dn,,,c1,,,c2);/*,转换为整数形式输出*,/,c1,、,c2,被指定为字符变量。但在第,3,和第,4,行中,将整数,97,和,98,分别赋给,c1,和,c2,,它的作用相当于以下两个赋值语句:,c1=a,;,c2=b,;,因为,a,和,b,的,ASCII,码为,97,和,98,。在程序的第,3,和第,4,行是把,97,和,98,两个整数直接存放到,c1,和,c2,的内存单元中。而,c1=a,和,c2=b,则是先将字符,a,和,b,化成,ascii,码,97,和,98,,然后放到内存单元中。二者的作用和结果是相同的。第,5,行输出两个字符,a,和,

44、b,。“,%c”,是输出字符时必须使用的格式符。程序第,6,行输出两个整数,97,和,98,。,图,3.9,程序运行时输出如下:,ab,9798,可以看到:字符型数据和整型数据是通用的。它们既可以用字符形式输出,(,用,%c),,也可以用整数形式输出,(,用,%d),,见图,3.9,。但是应注意字符数据只占一个字节,它只能存放,0,255,范围内的整数。,例,3.7,大小写字母的转换。,main(),char c1,,,c2,;,c1=a;,c2=b;,c1=c1-32;,c2=c2-32;,printf(%c,%c,,,c1,,,c2),;,运行结果为,ab,程序的作用是将两个小写字母,a,

45、和,b,转换成大写字母,a,和,b,。,a,的,ascii,码为,97,,而,a,为,65,,,b,为,98,,,b,为,66,。从,ascii,代码表中可以看到每一个小写字母比它相应的大写字母的,ascii,码大,32,。,c,语言允许字符数据与整数直接进行算术运算,即,a+32,会得到整数,97,,,a-32,会得到整数,65,。,C,语言对字符数据作这种处理使程序设计时增大了自由度。例如对字符作各种转换就比较方便。而在,basic,语言中,为了将小写字母,a,转换成大写字母,a,,需要用两个字符处理函数:用,asc,函数将字符转换成其相应的,ascii,码,再用,chr,函数将,asci

46、i,码转换为字符:,print,chr(asc(a)-32),这样来回转换,既增加程序的复杂性,又增加计算时间的开销。,字符数据与整型数据可以互相赋值。如:,int i;,char c;,i=a,;,c=97,;,是合法的。如果用格式符“,%d”,将,i,的值输出,可得到,97,。用“,%c”,输出,c,,可得字符,a,。,如果在上面语句之后执行以下语句:,printf(%c,,,%dn,,,c,,,c);,printf(%c,,,%dn,,,i,,,i);,输出:,a,,,97,a,,,97,说明:有些系统,(,如,pdp,,,Vax-11,,,turbo c),将字符变量中的最高位作为符号

47、位,也就是将字符处理成带符号的整数,即,signed char,型。它的取值范围是,-128,127,。如果使用,ascii,码为,0,127,间的字符,由于字节中最高位为,0,,因此用,%d,输出时,输出一个正整数。如果使用,ascii,码为,128,255,间的字符,由于在字节中最高位为,1,,用,%d,格式符输出时,就会得到一个负整数。例如,:,char c=130;,printf(“%d”,c);,得到,-126,。如果不想按有符号处理,可以将字符变量定义为,unsigned char,类型,这时其取值范围是,0,255,。,signed char,和,unsigned char,的含

48、义及用法与,signed int,和,unsigned int,相仿,但它只有一个字节。,3.5.4,字符串常量,前面已提到,字符常量是由一对单引号括起来的单个字符。,c,语言除了允许使用字符常量外,还允许使用字符串常量。字符串常量是一对双引号括起来的字符序列。如,:,“,how do you do.”,,“,CHINA,,,a,,,123.45,都是字符串常量。可以输出一个字符串,如,:,printf(how do you do.),;,不要将字符常量与字符串常量混淆。,a,是字符常量,“,a”,是字符串常量,二者不同。假设,c,被指定为字符变量:,char c;,c=a;,是正确的。而,c

49、a,;,是错误的。,c=“CHINA,也是错误的。不能把一个字符串赋给一个字符变量。,有人不能理解,a,和“,a”,究竟有什么区别,?c,规定:在每一个字符串的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。,C,规定以字符,0,作为字符串结束标志。,0,是一个,ASCII,码,为,0,的字符,从,ascii,代码表中可以看到,ascii,码为,0,的字符是“空操作字符”,即它不引起任何控制动作,也不是一个可显示的字符。如果有一个字符串“,CHINA”,,实际上在内存中是,C H I N A 0,它的长度不是,5,个字符,而是,6,个字符,最后一个字符为,0,。但在输出时不输出

50、0,。例如在,printf(how do you do.),中,输出时一个一个字符输出,直到遇到最后的,0,字符,就知道字符串结束,停止输出。注意,在写字符串时不必加,0,,否则会画蛇添足。,0,字符是系统自动加上的。字符串“,a”,,实际上包含,2,个字符:,a,和,0,,因此,把它赋给只能容纳一个字符的字符变量,c,:,c=a,;,显然是不行的。,在,c,语言中没有专门的字符串变量,(basic,中的字符串变量形式为,a,、,b,等,),,如果想将一个字符串存放在变量中,以便保存,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。这将在第,6,章中介绍。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服