3.1 使用常量
微视频
在程序中,有些数据是不需要改变的,也是不能改变的。因此,我们把这些不能改变的固定值称为常量。
3.1.1 认识常量
常量是固定值,在程序执行期间不会改变。常用的常量包括整型常量、浮点型常量、字符常量和字符串常量等。在程序中,常量可以不经说明而直接引用。
【实例3.1】编写程序,在屏幕中输出不同类型的常量数据(源代码\ch03\3.1.txt)。
#include <iostream> //头文件引用 using namespace std; //命名空间 int main() //主函数 { cout <<2021<<endl; //执行输出整型常量 cout <<3.1415<<endl; //执行输出实型常量 cout <<'a'<<endl; //执行输出字符常量 cout <<"Hello World!"<<endl; //执行输出字符串常量 }
程序运行结果如图3-1所示。cout是输出流,实现向屏幕输出不同类型的数据,其中3.1415也被称为实型变量。
图3-1 例3.1的程序运行结果
3.1.2 整型常量
在C++语言中,整型常量就是指直接使用的整型常数,例如0、15、-20等。整型常量可以分为长整型、短整型、符号整型和无符号整型,如表3-1所示。
表3-1 整型常量数据类型
☆大牛提醒☆
根据不同的编译器,整型的取值范围是不一样的,有可能在16位的计算机中整型就为16位,在32位的计算机中整型就为32位。
在编写整型常量时,可以在常量的后面添加“l”或“u”来修饰整型常量,若添加“l”或“L”则表示该整型常量为“长整型”,如“17L”;若添加“u”或“U”则表示该整型常量为“无符号型”,如“17u”;这里的“l”或“u”不区分大小写。
所有整型常量可以通过三种形式进行表达,分别是十进制、八进制、十六进制,并且各种数制均有正(+)负(-)之分,正数的“+”可省略。例如,0、-12、255、1、32767等都是整型数据。
(1)十进制:包含0~9中的数字,但是一定不能以0开头,如15,-255。
(2)八进制:只包含0~7中的数字,必须以0开头,如017(十进制的15)、0377(十进制的255)。
(3)十六进制:包含0~9中的数字和a~f中的字母,以0x或0X开头,如0xf(十进制的15)、0xff(十进制的-1)、0x7f(十进制的127)。
以下是各种类型整数常量的实例。
85 /* 十进制 */ 0213 /* 八进制 */ 0x4b /* 十六进制 */ 30 /* 整数 */ 30u /* 无符号整数 */ 30l /* 长整数 */
☆大牛提醒☆
整型数据是不允许出现小数点和其他特殊符号的。另外,在计算机中,整型常量以二进制方式存储;在日常生活中,数值的表示以十进制为主。
3.1.3 实型常量
C++语言中实型常量也被称为浮点型常量。它有两种表示形式:一种是十进制小数形式,一种是指数形式。
(1)十进制小数形式:由数码0~9和小数点组成。例如,0.1、25.2、5.789、0.13、5.8、300.5、-267.8230等均为合法的实数。注意,必须有小数点。
(2)指数形式:由十进制数加字母“e”或“E”及阶码(只能为整数,可以带符号)组成,这里的E代表指数10。例如,2.8E5、3.9E-2、0.1E7、-2.5E-2等。
☆大牛提醒☆
科学记数法要求字母e(或E)的两端必须都有数字,而且右侧必须为整数,因此e3、2.1e3.2、e是错误的。
【实例3.2】编写程序,在屏幕中输出实型常量(源代码\ch03\3.2.txt)。
#include <iostream> //头文件引用 using namespace std; //命名空间 int main() //主函数 { cout <<3.1415<<endl; //执行输出浮点数3.1415 cout <<-3.1415<<endl; //执行输出浮点数-3.1415 }
程序运行结果如图3-2所示。从结果可以看出,直接输出的数值都没有发生变化,这些数值都是实型常量。
图3-2 例3.2的程序运行结果
3.1.4 字符常量
字符常量是用单引号“'”括起来的一个字符,一个字符常量在计算机中占一个字节,例如'a'、'b'、'='、'+'、'?'都是合法的字符常量。字符常量的值为所括起的字符在ASCII表中的编码,所以字符和整数可以互相赋值。例如,字符“a”的ASCII码值为97,字符“A”的ASCII码值为65,字符“?”的ASCII码值为63。
在C++语言中,字符常量有以下特点。
(1)字符常量只能用单引号括起来,不能用双引号或其他括号。
(2)字符常量只能是单个字符,不能是字符串。
(3)字符可以是字符集中任意字符,但数字被定义为字符型后就不能参与数值运算。如'5'和5是不同的,'5'是字符常量,不能参与运算。
ASCII码表中还有很多通过键盘无法输入的字符,可以使用“\ddd”或“\xhh”来引用这些字符。“\ddd”是1~3位八进制数所代表的字符,“\xhh”是1~2位十六进制数所代表的字符。例如,“\101”表示ASCII码“A”,“\XOA”表示换行等。
【实例3.3】编写程序,输出ASCII码表中的部分字符(源代码\ch03\ 3.3.txt)。
#include <iostream> //头文件引用 using namespace std; //命名空间 int main() //主函数 { cout <<"A"<<endl; cout <<"\101"<<endl; cout <<"\x41"<<endl; cout <<"\052,\x1E"<<endl; }
程序运行结果如图3-3所示。
图3-3 例3.3的程序运行结果
除了正常显示的字符外,还有一些控制符是无法通过正常的字符形式表示的,如常用的回车、换行、退格等。因此,C++语言还使用了一种特殊形式的字符常量,这种特殊字符称为转义字符。例如上述代码中\101、\x41为转义字符。
使用转义字符时是以反斜杠(\)代表开始转义,后跟一个或几个字符的特定字符序列。它表示ASCII字符集中控制字符、某些用于功能定义的字符和其他字符,不同于字符原有的意义,故称为“转义”字符。常用的转义字符如表3-2所示。
表3-2 常用的转义字符
【实例3.4】编写程序,在命令行中输出字符常量与转义字符(源代码\ch03\3.4.txt)。
#include <iostream> //头文件引用 using namespace std; //命名空间 int main() //主函数 { cout <<"Hello\tWorld\n\n"<<endl; /*输出Hello World并换两次行*/ cout <<" a,A\n"<<endl; /*输出a,A并换行*/ cout <<"123\'\"\n "<<endl; /*输出123、单引号和双引号,最后换行*/ }
程序运行结果如图3-4所示。
图3-4 例3.4的程序运行结果
3.1.5 字符串常量
字符串常量是由一对双引号括起的字符序列。例如,"Hello World"、"C program"、"3.14"等都是合法的字符串常量。字符串常量和字符常量是不同的量,它们之间主要有以下区别。
(1)字符常量由单引号括起来,字符串常量由双引号括起来。
(2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
(3)可以把一个字符常量赋予一个字符串变量,但不能把一个字符串常量赋予一个字符变量。
☆大牛提醒☆
在C++语言中没有相应的字符串变量,但可以用一个字符数组来存放一个字符串常量,在后面的章节中会详细介绍。
(4)字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符"\0"(ASCII码为0),它是字符串结束的标志。
例如,字符串"C program"在内存中所占的字节可以表示为如下所示的样式。
字符常量'a'和字符串常量"a"虽然都只有一个字符,但在内存中的情况是不同的。字符常量'a'在内存中占一个字节,可表示为如下所示的样式。
字符串常量"a"在内存中占两个字节,可表示为如下所示的样式。
【实例3.5】编写程序,在命令行中输出字符串常量(源代码\ch03\3.5.txt)。
#include <iostream> //头文件引用 using namespace std; //命名空间 int main() //主函数 { cout <<"Hello World!"<<endl; /*输出Hello World!并换行*/ cout <<"Hello,dear!"<<endl; /*输出Hello,dear!*/ }
程序运行结果如图3-5所示。
图3-5 例3.5的程序运行结果
3.1.6 其他常量
除前面介绍的普通常量外,常量还包括布尔常量、枚举常量、宏定义常量等。
(1)布尔常量:布尔常量只有两个,一个是true,表示真;一个是false,表示假。注意,不能把true的值看成1,false的值看成0。
(2)枚举常量:枚举型数据中定义的成员也都是常量。
(3)宏定义常量:通过#define宏定义的一些值也被称为常量。例如:
#define PI 3.1415
其中,PI就是常量。