1、C+面向对象程序设计谭浩强第2章数据类型与表达式第2章 数据类型与表达式2.1 C+的数据类型2.2 常量2.3 变量2.4 C+的运算符2.5 算术运算符与算术表达式2.6 赋值运算符与赋值表达式2.7 逗号运算符与逗号表达式2.1 C+的数据类型计算机处理的对象是数据,而数据是以某种特定的形式存在的(例如整数浮点数字符等形式)不同的数据之间往往还存在某些联系(例如由若干个整数组成一个整数数组)数据结构指的是数据的组织形式例如,数组就是一种数据结构不同的计算机语言所允许使用的数据结构是不同的处理同一类问题,如果数据结构不同,算法也会不同例如,对10个整数排序和对包含10个元素的整型数组排序的
2、算法是不同的C+可以使用的数据类型如下:C+的数据包括常量与变量,常量与变量都具有类型由以上这些数据类型还可以构成更复杂的数据结构例如利用指针和结构体类型可以构成表树栈等复杂的数据结构C+并没有统一规定各类数据的精度数值范围和在内存中所占的字节数,各C+编译系统根据自己的情况作出安排书中表2.1列出了Visual C+数值型和字符型数据的情况说明:(1) 整型数据分为长整型(long int)一般整型(int)和短整型(short int)在int前面加long和short分别表示长整型和短整型(2) 整型数据的存储方式为按二进制数形式存储,例如十进制整数85的二进制形式为1010101,则在
3、内存中的存储形式如图2.1所示图2.1(3) 在整型符号int和字符型符号char的前面,可以加修饰符signed(表示“有符号”)或unsigned(表示“无符号”)如果指定为signed,则数值以补码形式存放,存储单元中的最高位(bit)用来表示数值的符号如果指定为unsigned,则数值没有符号,全部二进制位都用来表示数值本身例如短整型数据占两个字节 ,见图2.2图2.2有符号时,能存储的最大值为215-1,即32767,最小值为-32768无符号时,能存储的最大值为216-1,即65535,最小值为0有些数据是没有负值的,可以使用unsigned,它存储正数的范围比用signed时要大
4、一倍(4) 浮点型(又称实型)数据分为单精度(float)双精度(double)和长双精度(long double)3种,在Visual C+ 6.0中,对float提供6位有效数字,对double提供15位有效数字,并且float和double的数值范围不同对float分配4个字节,对double和long double分配8个字节(5) 表中类型标识符一栏中,方括号 包含的部分可以省写,如short和short int等效,unsigned int和unsigned等效常量的值是不能改变的,一般从其字面形式即可判别是否为常量常量包括两大类,即数值型常量(即常数)和字符型常量如12,0,-3
5、为整型常量,4.6,-1.23为实型常量,包含在两个单撇号之间的字符为字符常量,如a,x这种从字面形式即可识别的常量称为“字面常量”或“直接常量”2.2 常量2.2.1 什么是常量2.2.2 数值常量数值常量就是通常所说的常数在C+中,数值常量是区分类型的,从字面形式即可识别其类型1. 整型常量(整数)的类型在上一节中已知道: 整型数据可分为int,short int,long int以及unsigned int,unsigned short,unsigned long等类别整型常量也分为以上类别为什么将数值常量区分为不同的类别呢?因为在进行赋值或函数的参数虚实结合时要求数据类型匹配那么,一个
6、整型常量怎样从字面上区分为以上的类别呢?(1) 一个整数,如果其值在-32768+32767范围内,认为它是short int型,它可以赋值给short int型int型和long int型变量(2) 一个整数,如果其值超过了上述范围,而在-2147483648+2147483647范围内,则认为它是long int型,可以将它赋值给一个int或long int型变量(3) 如果某一计算机系统的C+版本(例如Visual C+)确定int与long int型数据在内存中占据的长度相同,则它们能够表示的数值的范围相同因此,一个int型的常量也同时是一个long int型常量,可以赋给int型或l
7、ong int型变量(4) 常量无unsigned型但一个非负值的整数可以赋值给unsigned整型变量,只要它的范围不超过变量的取值范围即可一个整型常量可以用3种不同的方式表示: (1) 十进制整数如1357,-432,0等在一个整型常量后面加一个字母l或L,则认为是long int型常量例如123L,421L,0L等,这往往用于函数调用中如果函数的形参为long int,则要求实参也为long int型,此时用123作实参不行,而要用123L作实参(2) 八进制整数在常数的开头加一个数字0,就表示这是以八进制数形式表示的常数如020表示这是八进制数20,即(20)8,它相当于十进制数16(
8、3) 十六进制整数在常数的开头加一个数字0和一个英文字母X(或x),就表示这是以十六进制数形式表示的常数如0X20表示这是十六进制数20,即(20)16,它相当于十进制数322. 浮点数的表示方法一个浮点数可以用两种不同的方式表示: (1) 十进制小数形式如21.456,-7.98等它一般由整数部分和小数部分组成,可以省略其中之一(如78.或.06,.0),但不能二者皆省略C+编译系统把用这种形式表示的浮点数一律按双精度常量处理,在内存中占8个字节如果在实数的数字之后加字母F或f,表示此数为单精度浮点数,如1234F,-43f,占4个字节如果加字母L或l,表示此数为长双精度数(long dou
9、ble),在GCC中占12个字节,在Visual C+ 6.0中占8个字节(2) 指数形式(即浮点形式)一个浮点数可以写成指数形式,如3.14159可以表示为0.314159101,3.14159100,31.415910-1,314.15910-2等形式在程序中应表示为: 0.314159e1,3.14159e0,31.4159e-1 ,314.159e-2,用字母e表示其后的数是以10为底的幂,如e12表示1012其一般形式为数符 数字部分 指数部分上面各数据中的0.314159,3.14159, 31.4159, 314.159 等就是其中的数字部分可以看到: 由于指数部分的存在,使得同
10、一个浮点数可以用不同的指数形式来表示,数字部分中小数点的位置是浮动的例如: a=0.314159e1;a=3.14159e0;a=31.4159e-1;a=314.159e-2;以上4个赋值语句中,用了不同形式的浮点数,但其作用是相同的在程序中不论把浮点数写成小数形式还是指数形式,在内存中都是以指数形式(即浮点形式)存储的例如不论在程序中写成314.159或314.159e0,31.4159e1,3.14159e2, 0.314159e3等形式,在内存中都是以规范化的指数形式存放,如图2.3所示图2.3数字部分必须小于1,同时,小数点后面第一个数字必须是一个非0数字,例如不能是0.031415
11、9因此314.159和314.159e0,31.4159e1,3.14159e2, 0.314159e3在内存中表示成0.314159103存储单元分为两部分,一部分用来存放数字部分,一部分用来存放指数部分为便于理解,在图2.3中是用十进制表示的,实际上在存储单元中是用二进制数来表示小数部分,用2的幂次来表示指数部分的对于以指数形式表示的数值常量,也都作为双精度常量处理 2.2.3 字符常量1. 普通的字符常量用单撇号括起来的一个字符就是字符型常量如a,#,%,D都是合法的字符常量,在内存中占一个字节注意: 字符常量只能包括一个字符,如AB 是不合法的字符常量区分大小写字母,如A和a是两个不同
12、的字符常量撇号()是定界符,而不属于字符常量的一部分如couta;输出的是一个字母“a”,而不是3个字符“a ”2. 转义字符常量除了以上形式的字符常量外,C+还允许用一种特殊形式的字符常量,就是以 “”开头的字符序列例如,n代表一个“换行”符“coutn; ” 将输出一个换行,其作用与“coutendl; ” 相同这种“控制字符”,在屏幕上是不能显示的在程序中也无法用一个一般形式的字符表示,只能采用特殊形式来表示常用的以“”开头的特殊字符见书中表2.23. 字符数据在内存中的存储形式及其使用方法将一个字符常量存放到内存单元时,实际上并不是把该字符本身放到内存单元中去,而是将该字符相应的ASC
13、II代码放到存储单元中如果字符变量c1的值为a,c2的值为b,则在变量中存放的是a的ASCII码97,b 的ASCII码98,如图2.4(a)所示,实际上在内存中是以二进制形式存放的,如图2.4(b)所示图2.4既然字符数据是以ASCII码存储的,它的存储形式就与整数的存储形式类似这样,在C+中字符型数据和整型数据之间就可以通用一个字符数据可以赋给一个整型变量,反之,一个整型数据也可以赋给一个字符变量也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算例2.1 将字符赋给整型变量#include using namespace std;int main( ) int i,j
14、; /i和j是整型变量i=A; /将一个字符常量赋给整型变量ij=B; /将一个字符常量赋给整型变量jcouti jn; /输出整型变量i和j的值,n 是换行符return 0;执行时输出 65 66i和j被指定为整型变量但在第5和第6行中,将字符A和B分别赋给i和j,它的作用相当于以下两个赋值语句:i=65;j=66;因为A和B的ASCII码为65和66在程序的第5和第6行是把65和66直接存放到i和j的内存单元中因此输出65和66可以看到:在一定条件下,字符型数据和整型数据是可以通用的但是应注意字符数据只占一个字节,它只能存放0255范围内的整数例2.2 字符数据与整数进行算术运算下面程序
15、的作用是将小写字母转换为大写字母#include using namespace std;int main( )char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; coutc1 c2endl; return 0;运行结果为A Ba的ASCII码为97,而A的ASCII码为65,b为98,B为66从ASCII代码表中可以看到每一个小写字母比它相应的大写字母的ASCII代码大32C+符数据与数值直接进行算术运算,a-32得到整数65,b-32得到整数66将65和66存放在c1,c2中,由于c1,c2是字符变量,因此用cout输出c1,c2时,得到字符A和B(A的ASCII码为65,B的ASCII码为66)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1