1、1第三章第三章 数据类型、运算符和表达式数据类型、运算符和表达式l 主要内容:主要内容:uC C 语言的数据类型语言的数据类型u常量与变量常量与变量u整型数据整型数据u浮点型数据浮点型数据u字符型数据字符型数据u变量赋初值变量赋初值u各类数值型数据间的混合运算各类数值型数据间的混合运算u算术运算符和算术表达式算术运算符和算术表达式u赋值运算符和赋值表达式赋值运算符和赋值表达式u逗号运算符和逗号表达式逗号运算符和逗号表达式23.1 C语言的数据类型语言的数据类型l 计算计算:3:3*2 2 数值型数据数值型数据l 在屏幕上显示在屏幕上显示“我是河科人我是河科人 字符串常量字符串常量l 到到203
2、203房间找某人房间找某人 指针型数据指针型数据l 学号为学号为101-103101-103的全体学生的全体学生 数组型数据数组型数据算法处理的对象是数据,数据是数据的组织形式即数据结构。算法处理的对象是数据,数据是数据的组织形式即数据结构。不同的数据之间往往存在某些联系。不同的计算机语言使用的不同的数据之间往往存在某些联系。不同的计算机语言使用的数据结构是不相同的。所以数据结构是不相同的。所以,处理同一类问题,如果数据结构处理同一类问题,如果数据结构不同,算法也会不同。因此不同,算法也会不同。因此,在程序设计时,应综合考虑算法在程序设计时,应综合考虑算法和数据结构。选择最佳的数据结构和算法。
3、和数据结构。选择最佳的数据结构和算法。回顾第二章回顾第二章:问题的提出问题的提出:33.1 C的数据类型的数据类型数据类型数据类型基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型数值型数值型字符型字符型枚举类型枚举类型整型数据整型数据实型实型(浮点浮点)数据数据单精度型单精度型双精度型双精度型数组类型数组类型结构体类型结构体类型共用体类型共用体类型所有的数据,在进行处理时都需要先存放进计算机的内存中,所所有的数据,在进行处理时都需要先存放进计算机的内存中,所以了解不同的数据在计算机中存储的形式是很重要的。以了解不同的数据在计算机中存储的形式是很重要的。43.2 常量与变量常量与变量
4、l 在程序设计中,我们不仅使用到在程序设计中,我们不仅使用到常量常量,如:,如:123123,-90-90,0.1250.125等,而且我们更多地还要使用等,而且我们更多地还要使用变量变量,因为它们的,因为它们的值在程序的运行中是可以改变的。值在程序的运行中是可以改变的。l 本节内容需要了解常量及变量的概念、变量的命名规则。本节内容需要了解常量及变量的概念、变量的命名规则。5l 语言字符集语言字符集1 1、英文字母:大小写各、英文字母:大小写各2626个,共计个,共计5252个;个;2 2、阿拉伯数:、阿拉伯数:0 09 9共共1010个数字;个数字;3 3、下划线:、下划线:_ _;4 4、
5、特殊符号:通常指由、特殊符号:通常指由12个符号组成的运算符。个符号组成的运算符。算术运算符:算术运算符:+-*/%+-关系运算符:关系运算符:=条件运算符:条件运算符:?:和和 =(即赋值运算符即赋值运算符)其他分隔符:其他分隔符:().,;一、一、C C语言字符集、标识符和关键字语言字符集、标识符和关键字6l C 语言的标识符语言的标识符l 标识符标识符:用来标识变量名、符号常量名、函数名、数组名、类型名、用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列。标识符就是一个名字。文件名的有效字符序列。标识符就是一个名字。l 合法标识符合法标识符:由字母、数字、下划线组成
6、且第一个字符必须为字母或下由字母、数字、下划线组成且第一个字符必须为字母或下划线;不允许超过划线;不允许超过3232个字符。但为了程序的可移植性,建议不要超过个字符。但为了程序的可移植性,建议不要超过8 8个字符。个字符。例例:student_name与与student_code是一样的标识符,超过是一样的标识符,超过8个的舍去。个的舍去。l 用户标识符用户标识符:去掉:去掉3232个关键字后的合法标识符个关键字后的合法标识符.例如:例如:intint、floatfloat、ifif等,是等,是C C语言的关键字,不能作为用户标识符。语言的关键字,不能作为用户标识符。注意:注意:*C语言标识符
7、中大、小字母不通用。例:语言标识符中大、小字母不通用。例:sum和和SUM是两个是两个 不同的标识符。不同的标识符。*C语言规定,保留关键字不能作为用户标识符。语言规定,保留关键字不能作为用户标识符。*C语言的保留关键字共有语言的保留关键字共有32个见附录个见附录B。7l C 语言的标识符语言的标识符.不能作标识符不能作标识符-不能作标识符不能作标识符不能以数字开头不能以数字开头关键字不能作用户标识符关键字不能作用户标识符关键字不能作用户标识符关键字不能作用户标识符#不能作标识符不能作标识符a1abc.ca_ba-babc1233aintIntLen#1else合法标识符:合法标识符:_22A
8、,lea_1,avg3,day,ABCde43xyw8不合法标识符:不合法标识符:M.J.YORK,$_238,#xy,a*b,8Tea判断下列用户标识符的合法性:判断下列用户标识符的合法性:8 就是具有就是具有特定含义特定含义的标识符,用户不能用来作为自定义标的标识符,用户不能用来作为自定义标识符。由识符。由ANSIANSI标准推荐的关键字有标准推荐的关键字有3232个,常用的有:个,常用的有:与数据类型有关的:与数据类型有关的:char intchar int float double signed unsigned float double signed unsigned short l
9、ong void struct short long void struct union type def union type def enum sizeof enum sizeof 与存储类别有关的:与存储类别有关的:auto extern register staticauto extern register static 与程序控制结构有关的:与程序控制结构有关的:do while for if else switch case do while for if else switch case default go to continue break return default go
10、 to continue break returnl 关键字关键字9二、常量与符号常量二、常量与符号常量 常量常量:在程序运行过程中在程序运行过程中,其值不变的量称为常量,如其值不变的量称为常量,如:85:85,-6767,23.723.7,AA,99,“A”A”等。一般从字面上即可判别,等。一般从字面上即可判别,这种常量叫直接常量这种常量叫直接常量(字面常量字面常量)。常量的分类:常量的分类:(1)整型常量整型常量 (2)实型常量实型常量 (3)字符常量字符常量 (4)字符字符串常量串常量 (5)符号常量。常量的类型符号常量。常量的类型,可通过书写形式来判别。可通过书写形式来判别。符号常量符
11、号常量:用一个用一个标识符标识符来表示一个常量就叫作符号常量,符来表示一个常量就叫作符号常量,符号常量的常用预处理命令号常量的常用预处理命令definedefine来实现,其定义形式为来实现,其定义形式为:#define#define 标识符标识符 常量常量 例如:例如:#define#define PI 3.1415 3.1415 含义为:定义含义为:定义PIPI为符号常量,其值为为符号常量,其值为3.14153.1415说明:一般习惯上用大写字母表示符号常量,用小写字母表示说明:一般习惯上用大写字母表示符号常量,用小写字母表示变量,以示区别。但仅仅是习惯而不是规定。变量,以示区别。但仅仅是
12、习惯而不是规定。10程序程序L3-1.C 符号常量的使用符号常量的使用#define PRICE 30#include main()int num,total;num=10;total=num*PRICE;printf(“total=%dn”,total);好处好处:1.含义清楚;定义符号常量时,要做到含义清楚;定义符号常量时,要做到”见名知见名知意意”;2.在需要改变一个常量时,能做到在需要改变一个常量时,能做到”一改全改一改全改”。说明说明:1.程序中的程序中的PRICE都代表都代表30 2.符号常量的值在其作用域内不能改变,也不能再赋值符号常量的值在其作用域内不能改变,也不能再赋值 3.
13、如果再用如果再用PRICE=40给符号常量赋值是错误的给符号常量赋值是错误的运行结果运行结果:total=300注意:注意:PRICE与与30之间不允许有之间不允许有=号。号。11符号常量使用时的注意事项符号常量使用时的注意事项注意:注意:l(1)一般习惯上用大写字母表示,以便与变量区分开一般习惯上用大写字母表示,以便与变量区分开(如如果用小写字母也可以,只是为了与变量区分,是习惯而果用小写字母也可以,只是为了与变量区分,是习惯而不是规定不是规定);l(2)定义符号常量时,不能以定义符号常量时,不能以“;”结束;结束;l(3)一个一个#define占一行,且要从第一列开始书写;占一行,且要从第
14、一列开始书写;l(4)一个源程序文件中可含有若干个一个源程序文件中可含有若干个define命令,不同命令,不同的的define命令中指定的命令中指定的“标识符标识符”不能相同;不能相同;12三、三、变量变量l 变量变量:在程序运行过程中在程序运行过程中,其值可以改变的量其值可以改变的量,称为变量。称为变量。l 变量的定义变量的定义:类型标识符类型标识符 标识符标识符1,1,标识符标识符2,.2,.标识符标识符n n;注意事项注意事项:(P39):(P39)在选择变量名和其他标识符时,应做到在选择变量名和其他标识符时,应做到“见名知意见名知意”。不允许是关键字。不允许是关键字。要求对变量须进行强
15、制性定义,即必须要求对变量须进行强制性定义,即必须“先定义、后使用先定义、后使用”。每个变量必须被指定为一种确定类型,以便编译时能为其分每个变量必须被指定为一种确定类型,以便编译时能为其分配存储单元。配存储单元。int a,b,c;/*a,b,c 为整型变量为整型变量 */float x,y,z;/*x,y,z 为单精度型变量为单精度型变量*/13三、三、变量变量l 变量的组成要素变量的组成要素 变量名变量名 变量类型变量类型 变量值变量值例如例如:int a=1515内存中的数据内存中的数据数据数据1515内存内存通过变量,可通过变量,可以为内存中的以为内存中的位置提供一个位置提供一个有意义
16、的名称有意义的名称在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。元中读取数据。a变量值变量值内存单元内存单元变量名变量名15143.3 数值型数据的表示数值型数据的表示一、整型常量一、整型常量l 表示形式表示形式 十进制整数十进制整数:与数学上的整数表示相同。如与数学上的整数表示相同。如:123,0,-456:123,0,-456 八进制整数八进制整数:以数字以数字0 0开头开头,
17、如如:0 0123=1123=1*8 82 2+2+2*8 81 1+3+3*8 80 0=(83)=(83)1010 -0 01111即即(-11)(-11)8 8=(-9)=(-9)1010 十六进制整数十六进制整数:以数字以数字0 0和字母和字母x x开头开头,如:如:0 x0 x123,-123,-0 x0 xa2a2 如如:0 x0 x123=1123=1*16162 2+2+2*16161 1+3+3*16160 0=(291)=(291)1010 -0 x0 xa2a2即即(-a2)(-a2)1616=(-162)=(-162)1010*八进制的数码范围为八进制的数码范围为07;
18、018 *十六进制的数码除了数字十六进制的数码除了数字09外外,还使用英文字还使用英文字母母a f(或或A F)表示表示1015。如:如:0 x1e 在在VC+6.0中数值型数据有两种中数值型数据有两种:整型和实型整型和实型15l整数的存储空间为整数的存储空间为4个字节,即个字节,即32个二进制位。个二进制位。l取值范围为取值范围为-231231-1,即即-21474836482147483647。3.3 数值型数据的表示数值型数据的表示在在VC+6.0VC+6.0中数值型数据有两种中数值型数据有两种:整型和实型整型和实型一、整型常量一、整型常量 整数(有符号的整数)在内存中存放的是它的补码,
19、整数(有符号的整数)在内存中存放的是它的补码,无符号数没有符号位,存放的就是原码。整数占用的字节无符号数没有符号位,存放的就是原码。整数占用的字节数与机型有关,数与机型有关,32位机上占用位机上占用4个字节。个字节。16l 整型数据在内存中的是按它的补码来存放的。整型数据在内存中的是按它的补码来存放的。l 如果要知道一个有符号的整数在内存中的存储形式,如果要知道一个有符号的整数在内存中的存储形式,一般方法是:一般方法是:原码原码反码反码补码补码l 如果已知内存中的一个二进制编码,还要用相反的方如果已知内存中的一个二进制编码,还要用相反的方法将其转换成有符号数。法将其转换成有符号数。请关注:请关
20、注:17补充:带符号数在计算机中的表示补充:带符号数在计算机中的表示l 整数在计算机中是按整数在计算机中是按补码补码存储的。存储的。l 原码:原码:用最高位作符号位,用最高位作符号位,0 0表示正数,表示正数,1 1表示负数;其余表示负数;其余各位表示数值的大小。各位表示数值的大小。l 反码:反码:正数的反码与原码相同,负数的反码是将原码除最正数的反码与原码相同,负数的反码是将原码除最高位之外,其它各位按位取反。高位之外,其它各位按位取反。l 补码:补码:正数的补码与原码相同,负数的补码是将反码的最正数的补码与原码相同,负数的补码是将反码的最低位加低位加1 1。数值数据有带符号数和无符号数之分
21、。数值数据有带符号数和无符号数之分。注意:负数的求补码的另一种方法:将该数的注意:负数的求补码的另一种方法:将该数的绝对值绝对值的二进制形的二进制形式,按位取反再加式,按位取反再加1。1834和和-34的的8位编码位编码l 例如:整数例如:整数 34 34 的的8 8位(位(1 1字节)编码字节)编码l 原码:原码:0 001000100100010l 反码:反码:0 001000100100010l 补码:补码:0 001000100100010l 例如:整数例如:整数-34-34 的的8 8位(位(1 1字节)编码字节)编码l 原码:原码:1 101000100100010l 反码:反码:
22、1 110111011011101l 补码:补码:1 110111101011110内存中存储形式内存中存储形式内存中存储形式内存中存储形式1934和和-34的的16位编码位编码l 例如:整数例如:整数 34 34 的的1616位(位(2 2字节)编码字节)编码l 原码:原码:0 00000000 001000100000000 00100010l 反码:反码:0 00000000 001000100000000 00100010l 补码:补码:0 000000000000000 0010001000100010l 例如:整数例如:整数-34-34 的的1616位(位(2 2字节)编码字节)编
23、码l 原码:原码:1 10000000 001000100000000 00100010l 反码:反码:1 11111111 110111011111111 11011101l 补码:补码:1 111111111111111 1101111011011110内存中存储形式内存中存储形式内存中存储形式内存中存储形式20二、整型变量二、整型变量l 在在 C C 语言中语言中,可以使用整型变量存放一个整型数据,可以使用整型变量存放一个整型数据,使这个变量的值在程序运行时能够发生变化。每定使这个变量的值在程序运行时能够发生变化。每定义一个变量,义一个变量,VC+VC+系统就会给该变量分配存储单系统就会
24、给该变量分配存储单元,用户可随时改变该存储单元的内容。元,用户可随时改变该存储单元的内容。但是但是,若若存储单元太大,会浪费存储空间;若存储单元太小,存储单元太大,会浪费存储空间;若存储单元太小,又影响存储的范围和精度。因而,又影响存储的范围和精度。因而,VC+VC+规定了规定了不不同类型的整型变量。同类型的整型变量。3.3 数值型数据的表示数值型数据的表示211、整型数据在内存中的存放形式、整型数据在内存中的存放形式 编译系统为整型变量在内存中分配了编译系统为整型变量在内存中分配了4个字节的存储单元,个字节的存储单元,数值以补码形式存储。数值以补码形式存储。2、整型变量的分类、整型变量的分类
25、 整型变量的基本类型符为:整型变量的基本类型符为:int 根据数据所占的二进制位数分为根据数据所占的二进制位数分为:int,long,short 同样存储长度的数据又分为:同样存储长度的数据又分为:unsigned,signed(隐含隐含)故可组合出六种类型。故可组合出六种类型。3、整型变量值的范围、整型变量值的范围 由机器中数据的存储长度决定。由机器中数据的存储长度决定。(见下表见下表)22l整型类型与数值范围整型类型与数值范围 如如VC+6.0中,数据长度中,数据长度:short(2字节字节)int(4字节字节)=long(4字节字节)关键字关键字 所占位数所占位数 取值范围取值范围 sh
26、ort 16(2B)short 16(2B)-32768-327683276732767即即-2-21515(2(21515-1)-1)unsigned short 16(2B)unsigned short 16(2B)0 065535 65535 即即0 0(2(21616-1)-1)intint 32(4B)-2 32(4B)-23131(2(23131-1)-1)unsigned intunsigned int 32(4B)0 32(4B)0(2(23232-1)-1)long 32(4B)long 32(4B)-2147483648-21474836482147483647214748
27、3647 unsigned long 32(4B)unsigned long 32(4B)0 042949672954294967295即即0 0(2(23232-1)-1)如何判断字节数呢?如何判断字节数呢?printf(%dn,sizeof(unsigned long int);23 如果既不指定如果既不指定unsigned也不指定也不指定signed,则隐含为,则隐含为signed,因此存储,因此存储单元中最高位为符号位单元中最高位为符号位(0为正为正,1为负为负)如果指定如果指定unsigned,则存储单元中全部二进制位用作存放数值本身。,则存储单元中全部二进制位用作存放数值本身。无符
28、号型变量只能存放不带符号的整数,而不能存放负数。无符号型变量只能存放不带符号的整数,而不能存放负数。一个无符号整型变量存放的正数范围比一般有符号整型变量中正数的一个无符号整型变量存放的正数范围比一般有符号整型变量中正数的范围扩大一倍范围扩大一倍例如:例如:int a;/*变量变量a的数值范围为的数值范围为-231 231-1,a的最大值的最大值2147483647*/unsigned int b;/*变量变量b的数值范围为的数值范围为0 232-1,b的最大值的最大值4294967295*/思考题:思考题:如果变量如果变量a=32767,再加再加1会出现什么情况?会出现什么情况?(见下页)(见
29、下页)24整型数据的溢出问题整型数据的溢出问题例例3.3 整型数据的计算整型数据的计算#includemain()int a,b;a=32767;b=a+1;printf(“%d,%dn”,a,b);运行结果:运行结果:32767,32768思考:将思考:将int b 改为改为short b,程,程 序运行后序运行后b的值是什么?的值是什么?25整型数据的溢出整型数据的溢出例例3.3”整型数据的溢出整型数据的溢出#includemain()int a;short b;a=32767;b=a+1;printf(“%d,%dn”,a,b);运行结果:运行结果:32767,-327681 0 0 0
30、 0 0 0 0 0 0 0 0 0 0 0 00 1 1 1 1 1 1 1 1 1 1 1 1 1 1 132767-32768 如下图:如下图:a:b:注意:此时,注意:此时,32767加加1得得不到不到32768,而得到,而得到-32768这这2个例子就说明了数据在内存中的存储形式不同,结果会不同!个例子就说明了数据在内存中的存储形式不同,结果会不同!264、整型变量的定义、整型变量的定义l 整型变量的定义形式:整型变量的定义形式:类型标识符类型标识符 变量名变量名1,1,变量名变量名2,2,变量名变量名n;n;如:如:intint a,b,c;a,b,c;longlong intin
31、t aa,bb,ccaa,bb,cc;long long a1,a2;a1,a2;unsigned unsigned u1,u2;u1,u2;其中其中intint为类型标识符,为类型标识符,a,b,ca,b,c为变量名。为变量名。其中其中long intlong int为类型标识符,为类型标识符,aa,bb,ccaa,bb,cc为变量名。为变量名。其中其中longlong为类型标识符,为类型标识符,a1,a2a1,a2为变量名。为变量名。其中其中unsignedunsigned为类型标识符,为类型标识符,u1,u2u1,u2为变量名。为变量名。l 变量必须变量必须“先定义、后使用先定义、后使用
32、”。自己设定,满足自己设定,满足标识符的规定。标识符的规定。;不可省;不可省对变量的定义一般是放在一个函数的开头声明部分。对变量的定义一般是放在一个函数的开头声明部分。27程序程序L3-2.C功能:整型变量的定义及使用功能:整型变量的定义及使用#includemain()int a,b,c,d;unsigned 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=-14说明:不同种类的整型数说明:不同种类的整型数据可以进行算术运算!据可以进行算术运算!28三、整型常量的类型三、整型常量的
33、类型l 如果一个整数的值在如果一个整数的值在-231231-1范围内,认为它是范围内,认为它是int型,型,可以赋值给可以赋值给int型和型和long int型变量。型变量。l VC+6.0中,分配给中,分配给long和和int的内存空间相同,所以一的内存空间相同,所以一个个int型常量既可赋值给型常量既可赋值给long也可给也可给int型变量。型变量。l 一个整常量后加一个字母一个整常量后加一个字母u或或U,认为是,认为是unsigned int型型(即存储单元中最高位不作为符号位,作为数据本身即存储单元中最高位不作为符号位,作为数据本身)例例如:若写成如:若写成-12345u,则先将,则先
34、将-12345转换成其补码转换成其补码53191,然后按无符号存储。然后按无符号存储。l 一个整常量后面加一个字母一个整常量后面加一个字母l或或L,认为是,认为是long int型。型。常量的类型有哪些?如何将整型常量赋给一个整型变常量的类型有哪些?如何将整型常量赋给一个整型变量?请注意以下几点:量?请注意以下几点:293.4 实型实型(浮点型浮点型)数据数据l 在程序设计中,不仅要使用到各种类型在程序设计中,不仅要使用到各种类型的整数,而且更多地要使用实数。的整数,而且更多地要使用实数。如:求下面数列的前如:求下面数列的前100100项之和:项之和:就必须使用实型数据。就必须使用实型数据。3
35、0一、浮点型常量的表示形式一、浮点型常量的表示形式l 十进制小数形式:包含整数部分、小数点和小数部分,十进制小数形式:包含整数部分、小数点和小数部分,如如:0.12:0.12,12.12.,23.023.0,1.01.0,.3.3,-2.5-2.5 等。注意等。注意:小数点不能省略。小数点不能省略。l 指数形式:指数形式:“十进制小数十进制小数”+“e(+“e(或或E)”E)”“十进制数整数十进制数整数”。如:如:2.7E122.7E12,123e+2123e+2,2.45e-22.45e-2分别表示分别表示2.72.710101212,123,12310102 2,2.45,2.451010
36、-2-2但注意但注意:小数点不能单独出现;小数点不能单独出现;0.0.0 .0 .e e或或E E的两边必须有数字的两边必须有数字,且且e e后必须为整数后必须为整数;如如:6E0.2:6E0.2 e5e5 例如:例如:e+3、2.03e+0.5、.e3、e 都是非法的实型常量表示方法。都是非法的实型常量表示方法。在字母在字母E或或e之前的小数部分中,小数点左边应之前的小数部分中,小数点左边应有一位且只能有一有一位且只能有一位非位非0的数字的数字,称为,称为“规范化的指数形式规范化的指数形式”。例:。例:1.23e2是规范化的,是规范化的,0.0123e2,12.3e1不是规范化指数形式。不是
37、规范化指数形式。一个浮点数在用指数形式输出时一个浮点数在用指数形式输出时,是按规范化的指数形式输出的。是按规范化的指数形式输出的。31二、浮点型变量二、浮点型变量变量类型变量类型 标识符标识符 存储单元存储单元 数值范围数值范围 有效数字有效数字单精度单精度 float 4字节字节(32位位)10-3810+38 67位位双精度双精度 double 8字节字节(64位位)10-30810+308 1516位位l 1、浮点型数据在内存中的存放形式、浮点型数据在内存中的存放形式l 占占4个字节个字节(32位位),分为小数部分和指数部分。,分为小数部分和指数部分。l 小数部分占的位数越多,数的有效数
38、字越多,精度就越高。小数部分占的位数越多,数的有效数字越多,精度就越高。l 指数部分越大(占的位数越多),表示数值范围越大。指数部分越大(占的位数越多),表示数值范围越大。l 如果要求精度特别高如果要求精度特别高,可以采用双精度浮点类型,有效位达可以采用双精度浮点类型,有效位达16-17位。位。l 2、浮点型变量的分类、浮点型变量的分类32三、浮点型变量的定义三、浮点型变量的定义l 浮点浮点型变量的定义形式:型变量的定义形式:类型标识符类型标识符 变量名变量名1 1,变量名,变量名2 2,变量名变量名n n;如:如:floatfloat a,b,c;a,b,c;double double a1
39、,a2;a1,a2;其中其中floatfloat为类型标识符,为类型标识符,a,b,ca,b,c为变量名。为变量名。其中其中doubledouble为类型标识符,为类型标识符,a1,a2a1,a2为变量名。为变量名。对每一个浮点型变量都应在使用前加以定义对每一个浮点型变量都应在使用前加以定义33四、浮点型数据的舍入误差四、浮点型数据的舍入误差例如:例如:#includemain()float a,b;a=123456.789e5;b=a+20;printf(“%f n”,b);输出结果:输出结果:12345678848.000000注意:应避免一个很大的数和注意:应避免一个很大的数和一个很小的
40、数直接相加、减,一个很小的数直接相加、减,否则会否则会“丢失丢失”小的数。即有小的数。即有效数字以外的数字就不精确了。效数字以外的数字就不精确了。34五、浮点型常量的类型五、浮点型常量的类型l C语言编译系统常将浮点型常量作为语言编译系统常将浮点型常量作为double 型来处理。型来处理。例:例:float f f=2.45678*4523.65 系统先将两数作为系统先将两数作为double 型,运算之后的结果,取前型,运算之后的结果,取前7位赋位赋给给float型的型的f.l 一个浮点型常量可以赋值给一个浮点型常量可以赋值给float型、型、double 型变量,那么系型变量,那么系统会根据
41、变量的类型统会根据变量的类型截取实型常量截取实型常量中相应的有效位数字。中相应的有效位数字。例:例:float a;a=11111.111 此时,此时,a只能接收只能接收7位有效数字,最后两位小数就不起作用。位有效数字,最后两位小数就不起作用。如果将如果将a改为改为double型型,则则9位有效数字就都存储在变量位有效数字就都存储在变量a中了。中了。353.5 字符型数据字符型数据l 在程序设计中,除了需要使用整型和实型数据之在程序设计中,除了需要使用整型和实型数据之外,还需要另外一种很重要的数据类型,即外,还需要另外一种很重要的数据类型,即字符字符型型数据,如姓名,文字信息等,都是字符型数据
42、,数据,如姓名,文字信息等,都是字符型数据,也叫文字型数据。也叫文字型数据。l 文字型数据有两种类型:单个字符和字符串文字型数据有两种类型:单个字符和字符串36基本基本ASCIIASCII码表的前码表的前3232个字符为控制字符(个字符为控制字符(ASCIIASCII码值码值为为031031)。)。接着为标准英文键盘上的每一个字符都规定了一个接着为标准英文键盘上的每一个字符都规定了一个ASCIIASCII码值,字符在内存中的存储格式按照码值,字符在内存中的存储格式按照ASCIIASCII码值码值所对应的二进制数确定。所对应的二进制数确定。空 格320 0 1 0 0 0 0 0A650 1 0
43、 0 0 0 0 1a970 1 1 0 0 0 0 1b980 1 1 0 0 0 1 037一、字符常量一、字符常量l 字符常量字符常量:用用单引号单引号括起来的括起来的一个一个字符。如字符。如:A:A、ee、?等。等。由反斜杠由反斜杠()()引导的转义字符。如:引导的转义字符。如:“n”n”表换行符。表换行符。注意:注意:a a与与aa不同,前者为变量,后者为字符常量。不同,前者为变量,后者为字符常量。9 9与与99也不同,前者为整型常量,后者是字符常量。也不同,前者为整型常量,后者是字符常量。aa与与AA是不同的字符常量。是不同的字符常量。每个字符型数据在内存中占一个字节;其存储的内容
44、为该每个字符型数据在内存中占一个字节;其存储的内容为该字符在字符在ASCIIASCII码表(见附录码表(见附录A A)中对应的数值。)中对应的数值。38 以以“”开头的字符开头的字符序列序列称为转义字符,这些字符的含义不是称为转义字符,这些字符的含义不是其本身,而是转成了新的意义。其本身,而是转成了新的意义。n换行,将当前位置移到下一行开头换行,将当前位置移到下一行开头 t 换区换区(横向跳格,跳到下一个输出区,一区占(横向跳格,跳到下一个输出区,一区占8列)列)b退格(删除前面的一个字符)退格(删除前面的一个字符)r 回车,将当前位置移到本行开头回车,将当前位置移到本行开头 代表一个反斜杠字
45、符代表一个反斜杠字符()代表一个单引号字符代表一个单引号字符()”代表一个双引号字符代表一个双引号字符()ddd13位位8进制数所表示的字符进制数所表示的字符 xhh12位位16进制数所表示的字符进制数所表示的字符字符形式字符形式功能功能39转义字符的应用举例转义字符的应用举例printf(n1234nabcdn);printf(7);printf(nabtcdtefn);printf(n1234bn);printf(40n);printf(x41n);1234abcd响一声铃声响一声铃声ab cd ef123空格(相当于空格(相当于”040n”)(空格的空格的ASCII码码=32)Aprin
46、tf(“abccden”);printf(“101 x56n”)abccde (9个字符)个字符)A V (2个字符个字符)重要考点:数字符的个数是关键!重要考点:数字符的个数是关键!40二、字符变量二、字符变量l 字符变量字符变量:只能存放一个字符并能改变其值的变量。只能存放一个字符并能改变其值的变量。字符型变量在内存中占字符型变量在内存中占1 1个字节个字节。l 字符变量的定义字符变量的定义:charchar 变量名变量名;例如:例如:char c1,c2,c3,c4;char c1,c2,c3,c4;l 变量变量c1,c2,c3,c4 c1,c2,c3,c4 中可存储中可存储字符数据字符
47、数据、介于介于-128-128127127的整数的整数或者或者转义字符转义字符。例如例如:字符字符A A的的ASCIIASCII码为:码为:65D65D(十进制)(十进制)=41H=41H(十六进制)(十六进制)=101Q=101Q(八进制)(八进制)字符字符A A可以表示为可以表示为AA、x41x41、101101。l 字符变量字符变量分类:分类:char char 和和 unsigned charunsigned char;41三、字符型数据在内存中的存储形式及使用方法三、字符型数据在内存中的存储形式及使用方法l 存储形式存储形式:按按 ASCIIASCII码存储。码存储。l 使用方法使用
48、方法:按字符使用按字符使用(%c)(%c):则使用字符本身。:则使用字符本身。按数值使用按数值使用(%d)(%d):则使用该字符的:则使用该字符的ASCIIASCII码值。码值。例如例如a=a,a=a,并不是把字符并不是把字符aa本身放到内存单元中,而本身放到内存单元中,而是将该字符的相应的是将该字符的相应的ASCIIASCII码码9797放到内存单元中。放到内存单元中。42四、字符型数据使用方法举例(见四、字符型数据使用方法举例(见P50)例例3.6 main()char c1,c2,c3=007;c1=A;c2=B;printf(c1=%c,c2=%cn,c1,c2);printf(c1=
49、%d,c2=%dn,c1,c2);printf(c3=%c,c3=%d n,c3);运行结果如下:运行结果如下:c1=A,c2=B c1=65,c2=66 一声响,一声响,c3=7但注意:一个字符变量不可以存放一个字符串,所以字符但注意:一个字符变量不可以存放一个字符串,所以字符不能用双引号括起来。不能用双引号括起来。43例例3.7 大小写字母的转换大小写字母的转换#includemain()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“%c%c”,c1,c2);运行结果:运行结果:A B注意字符的相加、字符的运算问题:注意字符的相加、字符的运算
50、问题:1.字符型数据和整型数据之间可以通用字符型数据和整型数据之间可以通用,可直接进行算术运算可直接进行算术运算.2.对字符数据进行算术运算对字符数据进行算术运算,相当于对它们的相当于对它们的ASCII进行算术运算进行算术运算.3.字符型与数值型可以互相赋值。字符型与数值型可以互相赋值。4.一个字符数据既可以字符形式输出一个字符数据既可以字符形式输出,也可以整数形式输出也可以整数形式输出.441、VC+将将字符变量默认定义为字符变量默认定义为signed char型型。其存储单元的最高。其存储单元的最高位为符号位,取值范围是位为符号位,取值范围是-128127。2、如果在字符变量中存放一个、如