2.2 常量与符号
常量是指在程序运行过程中不会改变的数值,如我们每个人的身份证号,这串数字就是一个常量,是不能更改的。常量可以分为整型常量、浮点型常量(实型常量)、字符常量和字符串常量,实例代码如下:
上面实例通过cout向屏幕输出4行内容。cout是输出流,实现向屏幕输出不同类型的数据。2009是整型常量,2.14是浮点型常量(实型常量),'a'是字符常量,"Hello World"是字符串常量。
2.2.1 整型常量
整型常量是指直接使用的整型常数,如0、100、-200等都是整型常数。
整型常量可以是长整型、短整型、符号整型和无符号整型。这几种整型常量如同容积不同的水杯,虽然用法一样,但在不同场景中需要使用不同容积的水杯。
表2.1 整型常量数据类型
注意:根据不同的编译器,整型常量的取值范围是不一样的。还有可能在16位的计算机中整型常量就为16位,在32位的计算机中整型常量就为32位。
在编写整型常量时,可以在整型常量的后面添加L或U进行修饰,L表示该常量是长整型,U表示该常量是无符号整型,例如:
注意:表示长整型和无符号整型的后缀L和U不区分大小写。
所有整型常量可以通过3种形式进行表示,分别为八进制、十进制和十六进制,下面分别进行介绍。
1.八进制
使用的数据表达形式是八进制,需要在整型常量前加上0进行修饰。八进制所包含的数字是0~7,例如:
以下是八进制的错误写法:
2.十六进制
整型常量前面使用0x作为前缀(需要注意的是0x中的0是数字0,而不是字母O),表示该整型常量是用十六进制进行表示的。十六进制所包含的数字是0~9及字母A~F,例如:
注意:其中字母A~F不区分大小写。
3.十进制
十进制是不需要在整形常量前面添加前缀的。十进制所包含的数字是0~9,例如:
整型数据都是以二进制的方式存储在计算机的内存中,其数值是以补码的形式进行表示的。正数的补码与其原码的形式相同,负数的补码是将该数绝对值的二进制形式按位取反再加1。例如,一个十进制数11在计算机内存中的表现形式如图2.6所示。
图2.6 十进制数11在计算机内存中的表现形式
如果是-11,那么在内存中又是怎样的呢?因为是以补码进行表示的,所以负数要先将其绝对值求出,然后进行取反操作,得到取反后的结果如图2.7所示。
图2.7 进行取反操作
取反之后还要进行加1操作,这样就得到最终的结果。-11在计算机内存中存储的形式如图2.8所示。
图2.8-11在计算机内存中存储的形式
注意:对于有符号整数来说,其在内存中存储的最左侧一位表示符号位,如果该位为0,则说明该数为正数;如果该位为1,则说明该数为负数。
注意:在 Windows 操作系统中,选择“开始”→“附件”→“计算器”命令,弹出“计算器”对话框,可以使用“计算器”对话框进行八进制、十进制和十六进制之间的转换。这里需要注意的是,要选用程序员计算器,其方法是,选择“查看”→“程序员”命令,显示的“计算器”对话框样式如图2.9所示。
图2.9 “计算器”对话框
2.2.2 实型常量
实型常量也称为浮点型常量,它是由整数部分和小数部分组成的,并且用十进制的小数点进行隔开,如图2.10所示的超市小票中的应付金额“1.80”就是实型常量。
图2.10 实型常量
在C++中表示实型常量的方式有以下两种。
1.科学计数方式
科学计数方式是使用十进制的小数方法描述实型常量的,例如:
2.指数方式
有时实型常量非常大或非常小,使用科学计数方式不利于用户观察,这时可以使用指数方式表示实型常量。其中,使用e或E进行指数显示,如514e2表示的是51400,而514e-2表示的是5.14。使用指数方式显示SciNum1和SciNum2,例如:
在编写实型常量时,可以在实型常量的后面添加 F 或L 进行修饰,F 表示该常量是单精度类型,L表示该常量是长双精度类型,例如:
注意:如果不在实型常量后面添加后缀,在默认状态下,实型常量为双精度类型;在实型常量后面添加的后缀不区分大小写。
2.2.3 字符常量
字符常量是用单引号括起来的一个字符,如'a'和'?'都是合法的字符常量。在对代码进行编译时,编译器会根据ASCII码表将字符常量转换成整型常量。字符'a'的ASCII码值是97,字符'A'的ASCII码值是65,字符'?'的ASCII码值是63。在ASCII码表中还有很多无法通过键盘输入的字符,可以使用'\ddd'或'\xhh'来引用这些字符,并且 ASCII 码表中的所有字符都可以使用'\ddd'或'\xhh'来引用。'\ddd'是1~3 位八进制数所代表的字符,'\xhh'是1~2 位十六进制数所代表的字符,如'\101'表示ASCII码“A”,'\XOA'表示换行等。
转义字符应用,代码如下:
程序运行结果如图2.11所示。
图2.11 转义字符应用
转义字符是特殊的字符常量,使用时以字符“\”表示开始转义,转义字符说明如表2.2所示。
表2.2 转义字符说明
续表
2.2.4 字符串常量
字符串常量是用一组双引号括起来的若干个字符序列,如"ABC"、"abc"、"1314"和"您好"等都是正确的字符串常量。
如果在字符串常量中一个字符都没有,则将其称为空字符串,此时字符串的长度为0,如""。
在C++中存储字符串常量时,系统会在字符串的末尾自动添加一个“\0”作为字符串的结束标志,如字符串“welcome”在内存中的存储形式如图2.12所示。
图2.12 字符串“welcome”在内存中的存储形式
注意:在C++程序中编写字符串常量时,不必在一个字符串的结尾处添加“\0”结束标志,系统会自动添加“\0”结束标志。
前面介绍了有关字符常量和字符串常量的内容,它们之间的区别主要表现在以下几方面。
(1)定界符的使用不同。字符常量使用的是单引号,而字符串常量使用的是双引号。
(2)长度不同。字符常量只能有一个字符,也就是说字符常量的长度是1。字符串常量的长度可以是0。但是需要注意的是,即使字符串常量中的字符只有1个,长度却不是1。如字符串常量“H”,其长度为2,如图2.13所示为字符串常量“H”在内存中的存储方式。
图2.13 字符串常量“H”在内存中的存储方式
(3)存储的方式不同。在字符常量中存储的是字符的ASCII码值,如“A”的ASCII值为65,“a”的ASCII值为97。在字符串常量中,不仅要存储有效的字符,还要存储结尾的结束标志“\0”。
注意:系统会自动在字符串的末尾添加一个字符串的结束标志“\0”,这也就是字符串常量“H”的长度是2的原因。
上文简单介绍了有关ASCII码表的内容,那么ASCII码表是什么呢?在C++中,所使用的字符被一一映射到一个表中,这个表被称为ASCII码表,如表2.3所示。
表2.3 十进制的ASCII码表
续表
2.2.5 其他常量
常量除包括整型常量、浮点型常量、字符常量和字符串常量外,还包括布尔常量、枚举常量、宏定义常量等。
● 布尔(bool)常量:布尔常量只有两个,一个是true,表示真;另一个是false,表示假。
● 枚举常量:在枚举型数据中定义的成员也都是常量,这将在后文介绍。
● 宏定义常量:通过#define宏定义的一些值也是常量,例如:
其中,PI就是常量。