2.1 变量与常量
数据类型是指对数据的解释,它规范了不同数据在计算机内存储空间的大小与存储的具体形式。
2.1.1 标识符与关键字
现实世界中每个事物都有自己的名字,从而与其他事物区分开。例如,现实生活中每种交通工具都有一个名称来标识,如图2.1所示。
在程序设计语言中,同样也需要对程序中的各个元素命名加以区分,这种用来标识常量、变量、自定义类型、函数和标号等元素的记号称为标识符。
C++语言规定,标识符是由字母、数字和下画线组成的,并且只能以字母或下画线开头的字符集合。在使用标识符时应注意以下几点:
- 标识符中的大小写字母是有区别的。
- 命名时应遵循见名知义的原则。
- 系统已用的关键字不得用作标识符。
关键字是系统已经定义过的标识符,它在程序中已有了特定的含义,如int、char等。C++中的关键字都是小写字母,表2.1列出了C++中的所有关键字。
图2.1 现实生活中的标识符
表2.1 C++中的关键字
2.1.2 变量与赋值
日常生活中,例如,大家在淘宝购物的时候,都会有一个购物车,用来进行存储用户想购买的物品,等到所有的物品都挑选完成后,选择结算即可,如图2.2所示。
图2.2 淘宝购物流程
进行结算时,要对多个数据进行求和,需先把这些数据先存储起来,再对这些数据进行累加。在C++中,若要存储数据,需要用到变量。变量可以理解为淘宝购物车中存储的物品,如苹果、水等。变量的赋值是通过等号来表示的,进行结算时是每个变量进行相加的过程。示例代码如下:
上述示例中,apple、water、sum都是变量,其中,apple和water变量就好比购物车中存储的物品,它们分别存储的数据是20和7。sum变量存储的数据是apple和water这两个物品的数据累计之和。
2.1.3 变量的类型
变量用来存储数据,那么大家来思考一下:如何选择合适的容器来存放数据才不至于浪费空间,可以保存什么样的数据呢?在介绍数据类型之前,先来看一个生活中的例子。比如,某公司要快递一本书,文件袋和纸箱都可以装载,但是,如果使用纸箱装一本书,显然有点大材小用,浪费纸箱的空间,如图2.3所示。
同样,大家如果在使用变量进行存储数据时,为了更充分地利用内存空间,可以为变量指定不同的数据类型。C++数据类型如图2.4所示。
图2.3 纸箱与文件袋快递一本书
图2.4 C++数据类型
在图2.4中,可看到C++提供的基本数据类型有整型、实型、字符型和空型;复合类型有指针型、引用型;构造类型有数组、枚举、结构体、联合体、类。这些类型中不同于C语言的主要是引用型与类,这两种类型将在后面的章节中详细讲解,整个面向对象程序设计的学习都是围绕类展开的。
有关基本数据类型的说明如表2.2所示,其中数据长度在不同的操作系统下编译器对应的值有可能不相同,需要参考相应的手册。
表2.2 C++基本数据类型
说明:
(1)无符号(unsigned)和有符号(signed)的区别在于数值最高位的含义。对于signed类型来说,最高位是符号位,其余各位表示数值大小,而unsigned类型的各个位都用来表示数值大小,因此相同基本数据类型的signed和unsigned的数值范围是不同的。
(2)许多C++版本还有布尔型(bool),即值为true或false。事实上,在计算机编译系统中将true表示成整数1,false表示成整数0,因此也可以把布尔型看成是一个整型。
2.1.4 常量
在程序执行过程中,其值不能改变的量称为常量。普通常量的类型是根据数据的书写形式来决定的。如100是整型常量,0.5是实型常量,'q'是字符型常量,"qianfeng"是字符串常量。
1. 整型常量
在C++中,使用的整型常量可以用八进制、十进制和十六进制3种方式表示,具体如下所示:
- 十进制整型常量是最常用的一种表示形式,如321、-123。
- 八进制整型常量以0开头作为前缀,其数码取值为0~7,如025、-066。
- 十六进制整型常量以0x或0X开头作为前缀,其数码取值为0~9、A~F或a~f,如0xffff、-0X15。
整型常量在表示时,除了用前缀表示进制外,有时还需要用到后缀表示long、unsigned修饰符。当表示长整型常数时,需要在该数的后面加上L或l,如2345L;当表示无符号整型常数时,需要在该数的后面加上U或u,如4567U。
2. 实型常量
实型常量又称浮点型常量,它由整数部分和小数部分组成,其表示形式有以下两种形式:
- 小数表示形式,它由数字和小数点组成,不可省略小数点,但可以省略整数部分或小数部分数字,如1.、.21。
- 指数表示形式,它由小数表示法后加e(或E)和指数组成,指数部分可正可负,但必须是整数,并且e前边必须有数字,如1.23e-5、.23e6。
实型常量分单精度、双精度和长双精度3类,它们用后缀加以区分,不加后缀的为双精度浮点型常量,如2.12;加后缀F或f的为单精度浮点型常量,如2.12f;加后缀L或l的为长双精度浮点型常量,如0.56e7L。
3. 字符型常量
用一对单引号括起来表示的形式就是字符型常量。在内存中,字符数据以ASCII码的形式存储,在一定范围内可以与整数相互赋值,但含义有所不同。ASCII码是一种给字符编码的国际标准,它以整数表示字符,比如十进制数65,表示字符'A'。此处注意数字与字符的区别,如4与'4'是不同的,4是整数,'4'是字符,对应的ASCII码值为52。
在C++中,有些特殊字符用转义字符表示,转义字符以反斜杠“\”开头,后跟若干个字符。转义字符具有特定的含义,不同于字符原有的意义,故称转义字符,表2.3列出了常用的特殊字符。
表2.3 常用的转义字符及含义
在表2.3中,'\ddd'和'\xhh'都是用ASCII码表示一个字符,如'\101'和'\x41'都是表示字符'A'。转义字符在输出中有许多应用,如想让计算机的喇叭发出响声,可以使用下面的语句。
cout << '\a';
如果需要在屏幕上输出以下内容:
小千对小锋说:"遇到IT技术难题,就上扣丁学堂"。
不能使用以下方法:
cout <<"小千对小锋说:"遇到IT技术难题,就上扣丁学堂"。"<<endl;
因为双引号在C++中是有特殊作用的,上述写法会使编译器产生错误,正确的语句如下所示:
cout <<"小千对小锋说:\"遇到IT技术难题,就上扣丁学堂\"。"<<endl;
4. 字符串常量
字符串常量是由一对双引号括起来的字符序列。被括起来的字符序列可以是一个字符,也可以是多个字符,还可以没有字符。如"q"、"qian"、""。字符串常量都有一个结束符,用来标识字符串的结束,该结束符是'\0',即ASCII码值为0的空字符。
对于初学者,经常混淆字符与字符串的概念,它们是不同的量,两者区别如下:
- 字符用单引号括起来,字符串用双引号括起来;
- 字符与字符串占用的内存空间不同,字符只占用一个字节的空间,而字符串占用的内存字节数等于双引号中的字符个数加1,如字符'q'和字符串"q"在内存中的情况是不同的,字符'q'在内存中占一个字节,而字符串"q"在内存中占两个字节,如图2.5所示。
图2.5 字符'q'与字符串"q"在内存中的表示
5. 符号常量
有一种特殊的常量是用标识符来表示的,称为符号常量。符号常量主要用于帮助记忆和提高程序的可读性与维护性。例如,程序中经常会用到圆周率,假设为3.14,如果程序想提高圆周率的精度到3.141 592 65,那么它在程序中出现的所有地方都需要做修改,大大降低了程序的维护性。这时如果用PI表示圆周率,每次使用时都写PI,那么在需要修改PI的精度时,只需要修改PI的初值就可以了。在C++中,为了保持与C语言的兼容,允许程序用编译预处理指令#define来定义一个符号常量,上面的圆周率可以通过如下定义:
#define PI 3.14159265
这条指令的格式是#define后跟一个标识符和一串字符,中间用空格隔开。由于它不是C++语句,因此此行没有分号。在程序编译时,编译器首先将程序中的PI用3.14159265来替换,然后再进行代码编译。标识符后面的内容实际上是一个字符串,编译器本身不会对其进行任何语法检查,仅仅是在程序中将标识符简单替换为字符串,因此,有时会带来意想不到的错误。
6. const常量
在定义变量时,可以使用const关键字来修饰,这样的变量是只读的,即在程序中不能对其修改,只能读取。由于不可修改,因而它是一个符号常量,且在定义时必须进行初始化。需要说明的是,通常将符号常量中的标识符写成大写字母易于与其他标识符区分。用const关键字定义符号常量的格式如下:
const数据类型 常量名=初值表达式;
上面的圆周率可以通过如下定义:
const double PI=3.14159265;
const还可以放在数据类型名后,具体示例如下:
double const PI=3.14159265;
注意下面的语句是错误的:
接下来演示通过const关键字定义符号常量,如例2-1所示。
例2-1
运行结果如图2.6所示。
图2.6 例2-1运行结果
在例2-1中,第3行通过const关键字定义一个符号常量PI表示圆周率。第7行中使用圆周率就可以用PI来代替。