《c程序设计谭浩强第03章课件.ppt》由会员分享,可在线阅读,更多相关《c程序设计谭浩强第03章课件.ppt(110页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章 数据类型、运算符与表达式3.1 C的数据类型的数据类型3.2 常量与变量常量与变量3.3 整型数据整型数据3.4 实型数据实型数据3.5 字符型数据字符型数据3.6 变量赋初值变量赋初值3.7 各类数值型数据间的混合运算各类数值型数据间的混合运算3.8 算术运算符和算术表达式算术运算符和算术表达式3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式3.1C的数据类型的数据类型n数据结构数据结构+算法算法=程序程序其中,其中,n(1)对操作的描述。即操作步骤,也就是算法对操作的描述。即操作步骤,也就是算法(algorithm)。n(2
2、)对数据的描述。在程序中要指定数据的类型和对数据的描述。在程序中要指定数据的类型和数据的组织形式数据的组织形式,即数据结构,即数据结构(datastructure)。n处理同一类问题,如果数据结构不同,算法也处理同一类问题,如果数据结构不同,算法也会不同。因此,在考虑算法时,必须注意数据会不同。因此,在考虑算法时,必须注意数据结构。结构。nC语言的数据结构是以数据类型形式出现的。语言的数据结构是以数据类型形式出现的。nC的数据类型如下的数据类型如下:数据类型数据类型基本类型基本类型整型整型单精度型单精度型字符型字符型双精度型双精度型实型实型(浮点型浮点型)共用体类型共用体类型结构体类型结构体类
3、型数组类型数组类型构造类型构造类型枚举类型枚举类型空类型空类型指针类型指针类型n由以上这些数据类型还可以构成更复杂的数据由以上这些数据类型还可以构成更复杂的数据结构。结构。n例如利用指针和结构体类型可以构成表、树、例如利用指针和结构体类型可以构成表、树、栈等复杂的数据结构。栈等复杂的数据结构。3.2常量与变量常量与变量3.2.1常量和符号常量常量和符号常量n常量常量:在程序运行过程中,其值不能被改变的量。在程序运行过程中,其值不能被改变的量。n常量区分为不同的类型,如常量区分为不同的类型,如12,0,-3为整型常为整型常量,量,4.6、-1.23为实型常量,为实型常量,a,d为为字符常量。字符
4、常量。n常量一般从其字面形式即可判别,这种常量称为常量一般从其字面形式即可判别,这种常量称为字面常量或字面常量或直接常量直接常量。n用一个标识符代表一个常量,称为用一个标识符代表一个常量,称为符号常量。符号常量。n例例3.1符号常量的使用。符号常量的使用。#definePRICE30#includemain()intnum,total;num=10;total=num*PRICE;printf(total=%d,total);本文件中出现的本文件中出现的PRICE都代表都代表30,可以像常量,可以像常量一样进行运算一样进行运算.n请注意请注意符号常量符号常量不同于变量,它的不同于变量,它的值在
5、其作用值在其作用域域(在本例中为主函数在本例中为主函数)内不能改变内不能改变,也不能再,也不能再被赋值。如再用以下赋值语句给被赋值。如再用以下赋值语句给PRICE赋值是错赋值是错误的。误的。PRICE=40;n习惯上,符号常量名用大写,变量用小写,以习惯上,符号常量名用大写,变量用小写,以示区别。示区别。n使用符号常量的好处是:使用符号常量的好处是:n(1)含义清楚含义清楚。如上面的程序中,看程序时从。如上面的程序中,看程序时从PRICE就可知道它代表价格。因此定义符号常量名时应考虑就可知道它代表价格。因此定义符号常量名时应考虑“见见名知意名知意”。n(2)在需要改变一个常量时能做到在需要改变
6、一个常量时能做到“一改全改一改全改”。3.2.2变量变量n变量:其值在程序运行期间可以改变的量。变量:其值在程序运行期间可以改变的量。n一个变量应该有一个名字,在一个变量应该有一个名字,在内存内存中占据一定中占据一定的的存储单元存储单元。在该存储单元中存放变量的值。在该存储单元中存放变量的值。n请注意请注意区分变量名和变量值区分变量名和变量值这两个不同的概念,这两个不同的概念,见图见图3.1。n变量名实际上是一个符号地址,在对程序变量名实际上是一个符号地址,在对程序编译连接编译连接时时由系统给由系统给每一个变量名分配一个内存地址每一个变量名分配一个内存地址。n在程序中在程序中从变量中取值从变量
7、中取值,实际上是通过变量名找到,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。相应的内存地址,从其存储单元中读取数据。图图3.13.1n用来标识变量名、符号常量名、函数名、数组用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为名、类型名、文件名的有效字符序列称为标识标识符符(identifier)。nC语言规定标识符只能由语言规定标识符只能由字母、数字和下划线字母、数字和下划线三种字符组成,且三种字符组成,且第一个字符必须为字母或下第一个字符必须为字母或下划线划线。n下面列出的哪些是合法的标识符,哪些不是合下面列出的哪些是合法的标识符,哪些不是合法的变
8、量名:法的变量名:sum,average,_total,day,student_name,lotus_1_2_3,(li-ling,M.d.John,33,3d64,ab是错误的是错误的)n注意,大写字母和小写字母被认为是两个不同注意,大写字母和小写字母被认为是两个不同的字符,即的字符,即“大小写敏感大小写敏感”。因此,。因此,sum和和SUM是两个不同的变量名。是两个不同的变量名。nANSIC标准没有规定标准没有规定标识符的长度标识符的长度,但各个,但各个c编译系统都有自己的规定。编译系统都有自己的规定。n有的系统取有的系统取8个字符,假如程序中出现的变量名个字符,假如程序中出现的变量名长度
9、大于长度大于8个字符,则只有前面个字符,则只有前面8个字符有效,个字符有效,后面的不被识别。例如,有两个变量:后面的不被识别。例如,有两个变量:student_name和和student_number,由于二,由于二者的前者的前8个字符相同,系统认为这两个变量是一个字符相同,系统认为这两个变量是一回事而不加区别。可以将它们改为回事而不加区别。可以将它们改为stud_name和和stud_num,以使之区别。,以使之区别。n为了程序的为了程序的可移植性可移植性(即在甲机器上运行的程即在甲机器上运行的程序可以基本上不加修改,就能移到乙机器上运序可以基本上不加修改,就能移到乙机器上运行行)以及阅读程
10、序的方便,建议变量名的长度以及阅读程序的方便,建议变量名的长度不要超过不要超过8个个字符。字符。n在选择变量名和其他标识符时,应注意做到在选择变量名和其他标识符时,应注意做到“见名知意见名知意”,如,如count、name、day、month、total、country等;等;共性规则 n标识符最好采用英文单词标识符最好采用英文单词或其组合,便于记忆和阅或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。读。切忌使用汉语拼音来命名。n程序中的英文单词用词应当准确。例如不要把程序中的英文单词用词应当准确。例如不要把CurrentValue写成写成NowValue。n几十年前老几十年前老ANSIC规
11、定名字不准超过规定名字不准超过6个字符,现个字符,现今的今的C+/C不再有此限制。一般来说,长名字能不再有此限制。一般来说,长名字能更好地表达含义,所以函数名、变量名、类名长达更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为怪。十几个字符不足为怪。n那么名字是否越长越好?不见得那么名字是否越长越好?不见得!n单字符的名字也是有用的,常见的如单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z等,它们通常可用作函数内的局部等,它们通常可用作函数内的局部变量。变量。n命名规则命名规则尽量与尽量与所采用的所采用的操作系统操作系统或开发工具的或开发工具的风格风格保持一致保持一致。
12、n例如例如Windows应用程序的标识符应用程序的标识符(主要是主要是函数名函数名)通常采用通常采用“大小写大小写”混排混排的方式,如的方式,如AddChild。n而而Unix应用程序的标识符通常采用应用程序的标识符通常采用“小写加下划线小写加下划线”的方式,如的方式,如add_child。别把这两类风格混在一。别把这两类风格混在一起用。起用。n程序中不要出现仅靠大小写区分的相似的标识符。例程序中不要出现仅靠大小写区分的相似的标识符。例如:如:intx,X;/变量变量x与与X容易混淆容易混淆voidfoo(intx);/函数函数foo与与FOO容易混淆容易混淆voidFOO(floatx);n
13、在在c语言中,语言中,所有变量所有变量“先定义,后使用先定义,后使用”,因为:,因为:(1)凡未被事先定义的,不作为变量名,这就能保证程凡未被事先定义的,不作为变量名,这就能保证程序中变量名使用得正确。例如,如果在定义部分写了序中变量名使用得正确。例如,如果在定义部分写了intstudent;而在执行语句中错写成而在执行语句中错写成stadent。如:。如:stadent=30;在编译时检查出在编译时检查出statent未经定义,不作为变量名。因未经定义,不作为变量名。因此输出此输出“变量变量statent未经声明未经声明”的信息。的信息。(2)每一个变量被指定为一确定类型,在每一个变量被指定
14、为一确定类型,在编译时就能编译时就能为其分配相应的存储单元为其分配相应的存储单元。如指定。如指定a、b为为int型,型,turboc编译系统为编译系统为a和和b各分配两个字节,并按整数各分配两个字节,并按整数方式存储数据。方式存储数据。(3)指定每一变量属于一个类型,这就指定每一变量属于一个类型,这就便于在编译时便于在编译时,据此据此检查该变量所进行的运算是否合法检查该变量所进行的运算是否合法。例如,整型。例如,整型变量变量a和和b,可以进行求余运算:,可以进行求余运算:a%b但如果将但如果将a、b指定为实型变量,则不允许进行指定为实型变量,则不允许进行“求余求余”运算,在编译时会给出有关运算
15、,在编译时会给出有关“出错信息出错信息”。3.3整型数据整型数据3.3.1 3.3.1 整型常量的表示方法整型常量的表示方法n整型常量即整常数。整型常量即整常数。C C整常数可用以下三种形式整常数可用以下三种形式表示:表示:n(1)(1)十进制十进制整数。如整数。如123123,-456-456,0 0。n(2)(2)八进制八进制整数。以整数。以0 0开头开头的数是八进制数。如的数是八进制数。如01230123表示八进制数表示八进制数123123,即,即(123)(123)8 8。-011-011表示八进制数表示八进制数-11-11,即十进制数即十进制数-9-9。n(3)(3)十六进制十六进制
16、整数。以整数。以0 x0 x开头开头的数是十六进制数。如的数是十六进制数。如0 x1230 x123,代表十六进制数,代表十六进制数123123。-0 x12-0 x12等于十进制数等于十进制数-18-18。3.3.2整型变量整型变量n1.整型数据在内存中是以整型数据在内存中是以二进制形式存放二进制形式存放的。的。如:如:inti;/*定义为整型变量定义为整型变量*/i=10;/*给给i赋以整数赋以整数10*/十进制数十进制数10的二进制形式为的二进制形式为1010nTC系统为每一个系统为每一个整型变量整型变量在内存中分配在内存中分配2个字个字节,而节,而VC6.0分配分配4个字节个字节。n图
17、图3.2(a)是数据存放的示意图。图是数据存放的示意图。图3.2(b)是数据在内存是数据在内存中实际存放的情况。中实际存放的情况。n实际上,实际上,数值是以补码数值是以补码(complement)表示的表示的。n一个正数的补码和其原码的形式相同。如图一个正数的补码和其原码的形式相同。如图3.2(b)。n求求负数的补码负数的补码的方法是:将该数的的方法是:将该数的绝对值绝对值的二进制的二进制形式,形式,按位取反再加按位取反再加1。n例如求例如求-10的补码:的补码:取取-10的绝对值的绝对值10;10的绝对值的二进制形式为的绝对值的二进制形式为1010;图3.3n可知整数的可知整数的16位中,位
18、中,最左面的一位最左面的一位是是符号位符号位,该位为该位为0,表示数值为正;为,表示数值为正;为1则数值为负。则数值为负。2.整型变量的分类整型变量的分类n整型变量的基本类型符为整型变量的基本类型符为int。n根据数值的范围在根据数值的范围在int之前可以根据需要分别之前可以根据需要分别加上修饰符加上修饰符:short(短型短型)或或long(长型长型)。从而。从而分为以下三种整型变量:分为以下三种整型变量:(1)基本整型基本整型,以,以int表示。表示。(2)短整型短整型,以,以shortint表示,或以表示,或以short表示。表示。(3)长整型长整型,以,以longint表示,或以表示,
19、或以long表示。表示。n在在turboc中一个中一个int型的变量的值范围为型的变量的值范围为-215(215-1),即,即-3276832767。n在实际应用中,变量的值常常是正的在实际应用中,变量的值常常是正的(如学号、如学号、库存量、年龄、存款额等库存量、年龄、存款额等)。为了。为了充分利用变量充分利用变量的表数范围的表数范围,此时可以将变量定义为,此时可以将变量定义为“无符号无符号”类型。类型。n对以上三种都可以加上修饰符对以上三种都可以加上修饰符unsigned,以指定是,以指定是“无符号数无符号数”。n如果加上修饰符如果加上修饰符signed,则指定是,则指定是“有符号数有符号数
20、”。n如果既不指定为如果既不指定为signed,也不指定为,也不指定为unsigned,则,则隐含为有符号隐含为有符号(signed)。实际上。实际上signed一般不写一般不写。n归纳起来,可以用以下归纳起来,可以用以下6种整型变量。即:种整型变量。即:有符号基本整型有符号基本整型signedint无符号基本整型无符号基本整型unsignedint有符号短整型有符号短整型signedshortint无符号短整型无符号短整型unsignedshortint有符号长整型有符号长整型signedlongint无符号长整型无符号长整型unsignedlongintn方括弧方括弧内的部分是内的部分是可
21、以省略可以省略的的.n如果指定如果指定unsigned,为无符号型,存储单元中,为无符号型,存储单元中全全部二进位部二进位(bit)用作存放数本身用作存放数本身,而不包括符号。,而不包括符号。无符号型变量只能存放不带符号的整数,如无符号型变量只能存放不带符号的整数,如123、4687等,而不能存放负数,如等,而不能存放负数,如-123、-3。n一个一个无符号整型无符号整型变量中可以存放的正数的范围比一变量中可以存放的正数的范围比一般整型变量中正数的般整型变量中正数的范围扩大一倍范围扩大一倍。n如果在程序中定义如果在程序中定义a和和b两个变量两个变量:inta;unsignedintb;n则变量
22、则变量a的数值范围为的数值范围为-3276832767。而变量。而变量b的的数值范围为数值范围为065535。(a)表示有符号整型变量表示有符号整型变量a的最大值的最大值(32767)。(b)表示无符号整型变量表示无符号整型变量b的最大值的最大值(65535)。nC标准标准没有具体规定以上各类数据所占内存字节没有具体规定以上各类数据所占内存字节数,只数,只要求要求long型数据长度不短于型数据长度不短于int型型,short型不长于型不长于int型型。n具体如何实现,由各计算机系统的字长决定:具体如何实现,由各计算机系统的字长决定:nlong在在16和和32位操作系统中都是位操作系统中都是32
23、位。位。nshort在在16和和32位操作系统中都是位操作系统中都是16位。位。n16位操作系统(位操作系统(DOS,Windows3.x)int是是16位位的的.n32位操作系统位操作系统(Windows9x/NT/2000/XP)int是是32位位的的(范围达范围达21亿亿).n一个整数一个整数(以以13为例为例)在存储单元中的存储情况,见图在存储单元中的存储情况,见图3.5所示。所示。图3.5n/求某数据类型能表示的最大数n#include nvoid main()nint i;ndouble max=1;nfor(i=sizeof(int)*8;i0;i-)n max*=2;n max
24、-;nprintf(%fn,max);n3.整型变量的定义整型变量的定义n前面已提到,前面已提到,c规定在程序中所有用到的变量都规定在程序中所有用到的变量都必须在程序中必须在程序中“先定义,后使用先定义,后使用”,即,即“强制强制类型定义类型定义”。例如:。例如:inta,b;(指定变量指定变量a、b为整型为整型)unsignedshortc,d;(指定变量指定变量c、d为无符为无符号短整型号短整型)longe,f;(指定变量指定变量e、f为长整型为长整型)n对变量的对变量的定义,一般是放在一个函数的开头部定义,一般是放在一个函数的开头部分的声明部分分的声明部分。例例3.2整型变量的定义与使用
25、。整型变量的定义与使用。voidmain()inta,b,c,d;/定义定义a、b、c、d为整型变量为整型变量unsignedu;/定义定义u为无符号整型变量为无符号整型变量a=12;b=-24;u=10;c=a+u;d=b+u;printf(a+u=%d,b+u=%dn,c,d);运行结果为运行结果为:a+u=22,b+u=-14n可以看到可以看到不同种类的整型数据可以进行算术运算不同种类的整型数据可以进行算术运算。4.整型数据的溢出整型数据的溢出n假如,在假如,在VC中一个中一个int型变量的最大允许值为型变量的最大允许值为2147483647(0 x7fffffff),如果再加),如果再
26、加1,会,会出现什么情况出现什么情况?n例例3.3整型数据的溢出。整型数据的溢出。voidmain()ninta=2147483647,b;nb=a+1;nprintf(%d,%dn,a,b);n运行结果为运行结果为:2147483647,-2147483648n请注意:遇此情况就发生请注意:遇此情况就发生“溢出溢出”,但运行时并不但运行时并不报错。报错。n将变量将变量b改成范围更大的数据类型。改成范围更大的数据类型。图3.63.3.3整型常量的类型整型常量的类型我们已知整型变量可分为我们已知整型变量可分为int、shortint、longint和和unsignedint、unsignedsh
27、ort、unsignedlong等类别。那么常量是否也有这等类别。那么常量是否也有这些类别些类别?在将一个整型在将一个整型常量赋值给常量赋值给上述几种类上述几种类别的整型别的整型变量时如何做到类型匹配变量时如何做到类型匹配?请注意以请注意以下几点:下几点:(1)一个整数,如果其值在一个整数,如果其值在-2147483648+2147483647范围内,认为它是范围内,认为它是int型,它型,它可以赋值给可以赋值给int型和型和longint型变量。型变量。(2)一个一个int型的常量也同时是一个型的常量也同时是一个longint型常型常量,可以赋给量,可以赋给int型或型或longint型变量
28、。型变量。(3)一个整常量后面加一个字母一个整常量后面加一个字母u,认为是,认为是unsignedint型,型,如如12345u,在内存中按,在内存中按unsignedint规定的方式存放规定的方式存放(存储单元中最存储单元中最高位不作为符号位,而用来存储数据。高位不作为符号位,而用来存储数据。(4)在一个整常量后面加一个字母在一个整常量后面加一个字母l或或L,则认为,则认为是是longint型常量。型常量。例如例如123l、432L、0L等,等,这往往用于函数调用中。如果函数的形参为这往往用于函数调用中。如果函数的形参为longint型,则要求实参也为型,则要求实参也为longint型。型。
29、3.4实型数据实型数据3.4.1实型常量的表示方法实型常量的表示方法实数实数(realnumber)又称又称浮点数浮点数(floating-pointnumber)。实数有两种表示形式:。实数有两种表示形式:(1)十进制小数形式十进制小数形式。它由数字和小数点组成。它由数字和小数点组成(注意注意必须有小数点必须有小数点)。0.123、123.、123.0、0.0都是十进制小数形式。都是十进制小数形式。(2)指数形式指数形式。如。如123e3或或123E3都代表都代表123103。但注意字母。但注意字母e(或或E)之前必须有数之前必须有数字字,且,且e后面的指数必须为整数后面的指数必须为整数,如
30、,如e3、2.1e3.5、e3、e等都不是合法的指数形式。等都不是合法的指数形式。1.实型数据在内存中的实型数据在内存中的存放存放形式形式n在常用的微机系统中,一个实型数据在内存中占在常用的微机系统中,一个实型数据在内存中占4个字节个字节(32位位)。n与整型数据的图与整型数据的图3.7存储方式不同,实型数据是存储方式不同,实型数据是按按照指数形式存储照指数形式存储的。系统把一个实型数据分成的。系统把一个实型数据分成小小数部分和指数部分,分别存放数部分和指数部分,分别存放。指数部分采用规。指数部分采用规范化的指数形式。实数范化的指数形式。实数3.14159在内存中的存放在内存中的存放形式可以用
31、图形式可以用图3.7示意。示意。实型变量实型变量图图3.7n图中是用十进制数来示意的,实际上在计算图中是用十进制数来示意的,实际上在计算机中是用机中是用二进制数来表示小数部分二进制数来表示小数部分以及用以及用2的幂次来表示指数部分的幂次来表示指数部分的。的。n在在4个字节个字节(32位位)中,究竟用多少位来表示中,究竟用多少位来表示小数部分,多少位来表示指数部分,标准小数部分,多少位来表示指数部分,标准C并无具体规定,由各并无具体规定,由各C编译系统自定。编译系统自定。n小数部分小数部分占的位占的位(bit)数数愈多愈多,数的,数的有效数有效数字愈多,精度愈高字愈多,精度愈高。指数部分指数部分
32、占的位数占的位数愈多愈多,则能表示的则能表示的数值范围愈大数值范围愈大。2.实型变量的分类实型变量的分类nC实型变量分为单精度实型变量分为单精度(float型型)、双精度、双精度(double型型)和长双精度型和长双精度型(longdouble)三三类。类。nANSIC并未具体规定每种类型数据的长度、并未具体规定每种类型数据的长度、精度和数值范围。精度和数值范围。n有的系统将有的系统将double型型(8字节字节)所所增加的增加的32位全用于位全用于存放小数部分存放小数部分,这样可以,这样可以增加数值的有效位数,减少增加数值的有效位数,减少舍入误差舍入误差。n有的系统则将所有的系统则将所增加的
33、位增加的位(bit)用于存放指数部分用于存放指数部分,这样可以这样可以扩大数值的范围扩大数值的范围。表。表3.2列出的是微机上常列出的是微机上常用的用的c编译系统编译系统(如如turboc,Msc,borlandc)的的情况。应当了解,不同的系统会有差异。情况。应当了解,不同的系统会有差异。n对每一个实型变量都应在使用前加以定义。如对每一个实型变量都应在使用前加以定义。如:floatx,y,(指定指定x、y为单精度实数为单精度实数)doublez;(指定指定z为双精度实数为双精度实数)longdoublet;(指定指定t为长双精度实数,为长双精度实数,少用少用)3.实型数据的舍入误差实型数据的
34、舍入误差n由于实型变量是由有限的存储单元组成的,因由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在此能提供的有效数字总是有限的,在有效位以有效位以外的数字将被舍去外的数字将被舍去。由此。由此可能会产生一些误差可能会产生一些误差。例如,(例如,(a20)应该比应该比a大?大?例例3.4实型数据的舍入误差。实型数据的舍入误差。voidmain()floata,b;a=123456.789e5;b=a+20;printf(%f,b);n“%f”是输出一个实数时的格式符。是输出一个实数时的格式符。n一个实型变量只能保证的有效数字是一个实型变量只能保证的有效数字是7位有效位有效数
35、字数字,后面的数字是无意义的,并不准确地表,后面的数字是无意义的,并不准确地表示该数。示该数。n应当避免将一个很大的数和一个很小的数直接应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会相加或相减,否则就会“丢失丢失”小的数。与此小的数。与此类似,用程序计算类似,用程序计算1.0/3*3的结果可能不等于的结果可能不等于1。3.4.3实型常量的类型实型常量的类型nC编译系统将实型常量作为双精度来处理。例编译系统将实型常量作为双精度来处理。例如已定义一个实型变量如已定义一个实型变量f,有如下语句:,有如下语句:f=2.45678*4523.65这样做可以保证这样做可以保证计算结果更精确,
36、但是运算计算结果更精确,但是运算速度降低速度降低了。可以在数的了。可以在数的后面加字母后面加字母f或或F(如如1.65f,654.87F),这样编译系统就会,这样编译系统就会按单精度按单精度(32位位)处理。处理。n一个实型常量可以赋给一个一个实型常量可以赋给一个float型、型、double型或型或longdouble变量。变量。赋值时根据变量的类赋值时根据变量的类型截取实型常量中相应的有效位数字型截取实型常量中相应的有效位数字。假如。假如a已指定为单精度实型变量:已指定为单精度实型变量:floata;a=111111.111;由于由于float型变量只能接收型变量只能接收7位有效数字,因此
37、最位有效数字,因此最后两位小数可能不起作用。如果后两位小数可能不起作用。如果a改为改为double型,则能全部接收上述型,则能全部接收上述9位数字并存储在变量位数字并存储在变量a中。中。3.5字符型数据字符型数据3.5.1字符常量字符常量nC的字符常量是用的字符常量是用单引号单引号(即撇号即撇号)括起来的一括起来的一个字符。如个字符。如a,x,d,?,等都是字符常量。注意,等都是字符常量。注意,a和和A是是不同的字符常量。不同的字符常量。n除了以上形式的字符常量外,除了以上形式的字符常量外,C还允许用一种还允许用一种特殊形式的字符常量,就是以一个特殊形式的字符常量,就是以一个“”开头开头的转义
38、字符的转义字符。例如,。例如,n,它代表一个,它代表一个“换换行行”符。这是一种符。这是一种“控制字符控制字符”,在屏幕上是,在屏幕上是不能显示的。不能显示的。n常用转义字符,见常用转义字符,见P48表表33例例3.5转义字符的使用。转义字符的使用。voidmain()printf(“ab ctderftgn);printf(htibbjk);n其中,其中,“t”的作用是的作用是“跳格跳格”,即跳到下一,即跳到下一个个“制表位置制表位置”,一个,一个“制表区制表区”占占8列,列,“下一个制表位置下一个制表位置”从第从第9列开始列开始。n“r”,它代表,它代表“回车回车”(不换行不换行)n“n”
39、,作用是,作用是“使当前位置移到使当前位置移到下一行的开下一行的开头头”n“b”,作用是,作用是“退一格退一格”程序运行时在程序运行时在打印机打印机上得到以下结果:上得到以下结果:fab cgdehjik注意在注意在显示屏显示屏上的结果:上的结果:fgdehjkn结果不同的原因:结果不同的原因:“r”使当前位置回到本行开使当前位置回到本行开头,自此输出的字符头,自此输出的字符(包括空格和跳格所经过包括空格和跳格所经过的位置的位置)将取代原来屏幕上该位置上显示的字将取代原来屏幕上该位置上显示的字符。而在打印机输出时,不像显示屏那样会符。而在打印机输出时,不像显示屏那样会“抹掉抹掉”原字符,留下了
40、不可磨灭的痕迹,它能原字符,留下了不可磨灭的痕迹,它能真正反映输出的过程和结果。真正反映输出的过程和结果。3.5.2字符变量字符变量n字符型变量用来存放字符常量,请字符型变量用来存放字符常量,请注意只能放注意只能放一个字符一个字符。字符变量的定义形式如下:。字符变量的定义形式如下:charc1,c2;c1=a;c2=b;n在在所有的编译系统所有的编译系统中都规定以一个字节来存放中都规定以一个字节来存放一个字符,或者说一个字符,或者说一个字符变量在内存中占一一个字符变量在内存中占一个字节个字节。3.5.3字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法n将一个字符常量
41、放到一个将一个字符常量放到一个字符变量中,实际上并不字符变量中,实际上并不是把该字符本身放到内存是把该字符本身放到内存单元中去,而是单元中去,而是将该字符将该字符的相应的的相应的ASCII代码放到代码放到存储单元中存储单元中。例如字符。例如字符a的的ASCII代码为代码为97,b为为98,在内存中变量,在内存中变量c1、c2的值如图的值如图3.8(a)所示。所示。实际上是实际上是以二进制形式存以二进制形式存放放的,如图的,如图3.8(b)所示。所示。图图3.8n既然在内存中,字符数据以既然在内存中,字符数据以ASCII码存储,它码存储,它的的存储形式就与整数的存储形式类似存储形式就与整数的存储
42、形式类似。这样,。这样,字符型数据和整型数据之间就可以互相转换。字符型数据和整型数据之间就可以互相转换。n一个字符数据一个字符数据既可以以字符形式(既可以以字符形式(%c)输出,)输出,也可以以整数形式也可以以整数形式(%d)输出输出。n以字符形式输出时,需要先将存储单元中的以字符形式输出时,需要先将存储单元中的ASCII码转换成相应字符,然后输出码转换成相应字符,然后输出。n以整数形式输出时,以整数形式输出时,直接将直接将ASCII码作为整数输出码作为整数输出。n也可以对字符数据进行算术运算,相当于对它也可以对字符数据进行算术运算,相当于对它们的们的ASCII码进行算术运算。码进行算术运算。
43、例例3.6向字符变量赋以整数。向字符变量赋以整数。voidmain()charc1,c2;c1=97;c2=98;printf(%c%cn,c1,c2);/*以字符形式输出以字符形式输出*/printf(%d%dn,c1,c2);/*转换为整数形式输出转换为整数形式输出*/nc1=97;c2=98;作用相当于以下两个赋值语句:作用相当于以下两个赋值语句:c1=a;c2=b;nc1=97;c2=98;把把97和和98两个整数直接存两个整数直接存放到放到c1和和c2的内存单元中。的内存单元中。n而而c1=a和和c2=b则是先将字符则是先将字符a和和b化成化成ascii码码97和和98,然后放到内存
44、单元中。,然后放到内存单元中。n二者的作用和结果是相同的。二者的作用和结果是相同的。图图3.93.9程序运行时输出如下:程序运行时输出如下:ab9798n可以看到:可以看到:字符型数据和整型数据是通用的字符型数据和整型数据是通用的。它们既可以用字符形式输出它们既可以用字符形式输出(用用%c),也可以用,也可以用整数形式输出整数形式输出(用用%d),见图,见图3.9。n但是应注意但是应注意字符数据只占一个字节字符数据只占一个字节,它,它只能存只能存放放0255范围内的整数范围内的整数。例例3.7大小写字母的转换。大小写字母的转换。voidmain()charc1,c2;c1=a;c2=b;c1=
45、c1-32;c2=c2-32;printf(%c%cn,c1,c2);n运行结果为运行结果为:ABn从从ascii代码表中可以看到代码表中可以看到每一个小写字母比它相每一个小写字母比它相应的大写字母的应的大写字母的ascii码大码大32。c语言允许字符数语言允许字符数据与整数直接进行算术运算,即据与整数直接进行算术运算,即A+32会得到整会得到整数数97,a-32会得到整数会得到整数65。n字符数据与整型数据可以互相赋值字符数据与整型数据可以互相赋值。如:。如:inti;charc;i=a;c=97;是合法的。是合法的。n如果在上面语句之后执行以下语句:如果在上面语句之后执行以下语句:prin
46、tf(%c,%dn,c,c);printf(%c,%dn,i,i);输出:输出:a,97a,97n说明:有些系统说明:有些系统(如如pdp,Vax-11,turboc)将字符变量中的最高位作为符号位,也就是将字符变量中的最高位作为符号位,也就是将将字符处理成带符号的整数字符处理成带符号的整数,即,即signedchar型。型。它的取值范围是它的取值范围是-128127。n如果使用如果使用ascii码为码为0127间的字符,由于字间的字符,由于字节中最高位为节中最高位为0,因此用,因此用%d输出时,输出一个输出时,输出一个正整数。正整数。n如果使用如果使用ascii码为码为128255间的字符间
47、的字符,由于,由于在在字节中最高位为字节中最高位为1,用,用%d格式符输出时,就格式符输出时,就会得到一个会得到一个负整数负整数。n例如例如:charc=130;printf(“%d”,c);得到得到-126。n如果不想按有符号处理,可以将字符变量定义如果不想按有符号处理,可以将字符变量定义为为unsignedchar类型,类型,这时其取值范围是这时其取值范围是0255。3.5.4字符串常量字符串常量n字符串常量是一对字符串常量是一对双引号双引号括起来的字符序列。括起来的字符序列。如如:“howdoyoudo.”,“CHINA,a,”$123.45都是字符串常量。可以输出一个字符串,如都是字符
48、串常量。可以输出一个字符串,如:printf(howdoyoudo.);n不要将字符常量与字符串常量混淆。不要将字符常量与字符串常量混淆。a是字符是字符常量,常量,“a”是字符串常量,二者是字符串常量,二者不同不同。n假设假设c被指定为字符变量:被指定为字符变量:charc;c=a;是正确的。而是正确的。而c=a;是错误的。;是错误的。c=“CHINA也是错误的。也是错误的。不能把一个字符串赋给一个字符变量。不能把一个字符串赋给一个字符变量。n原因:原因:c规定:在规定:在每一个字符串的结尾加一个每一个字符串的结尾加一个“字符串字符串结束标志结束标志”,以便系统据此,以便系统据此判断字符串是否
49、结束判断字符串是否结束。C规规定以字符定以字符0作为字符串结束标志。作为字符串结束标志。n0是一个是一个ASCII码为码为0的字符,从的字符,从ascii代码表中可以代码表中可以看到看到ascii码为码为0的字符是的字符是“空操作字符空操作字符”,即它不引起,即它不引起任何控制动作,也不是一个可显示的字符。任何控制动作,也不是一个可显示的字符。n如果字符串如果字符串“CHINA”,实际上在内存中是:,实际上在内存中是:CHINA0n它的它的长度不是长度不是5个字符,而是个字符,而是6个字符个字符,最后一,最后一个字符为个字符为0。n字符串字符串“a”,实际上包含,实际上包含2个字符:个字符:a
50、和和0,因此,把它赋给只能容纳一个字符的,因此,把它赋给只能容纳一个字符的字符变量字符变量c,即,即c=a;显然是不行的。;显然是不行的。n但在输出时但在输出时不输出不输出0。例如在。例如在printf(“howdoyoudo.”)中,输出时一个一中,输出时一个一个字符输出,直到遇到最后的个字符输出,直到遇到最后的0字符,就字符,就知道字符串结束,停止输出。知道字符串结束,停止输出。n注意,在写字符串时不必加注意,在写字符串时不必加0,0字字符是系统自动加上的。符是系统自动加上的。n在在c语言中没有专门的字符串变量,如果想将语言中没有专门的字符串变量,如果想将一个字符串存放在变量中,以便保存,