![C++编程入门指南(全2册)](https://wfqqreader-1252317822.image.myqcloud.com/cover/112/47379112/b_47379112.jpg)
2.2 常量与符号
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_33_2.jpg?sign=1739349071-s7W581zlGZ8cwMyNxH2AOGVSYqcSWfM6-0-ac89810e71ad0ecb62712e47272b8d67)
常量是指在程序运行过程中不会改变的数值,如我们每个人的身份证号,这串数字就是一个常量,是不能更改的。常量可以分为整型常量、浮点型常量(实型常量)、字符常量和字符串常量,实例代码如下:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_33_3.jpg?sign=1739349071-4hMchIhH8IsBWRnlf0ihK8RiS2BDkuIp-0-48f69467b686b84d4cb1d2dcb7d012f0)
上面实例通过cout向屏幕输出4行内容。cout是输出流,实现向屏幕输出不同类型的数据。2009是整型常量,2.14是浮点型常量(实型常量),'a'是字符常量,"Hello World"是字符串常量。
2.2.1 整型常量
整型常量是指直接使用的整型常数,如0、100、-200等都是整型常数。
整型常量可以是长整型、短整型、符号整型和无符号整型。这几种整型常量如同容积不同的水杯,虽然用法一样,但在不同场景中需要使用不同容积的水杯。
表2.1 整型常量数据类型
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_33_4.jpg?sign=1739349071-HX3H7NZHvi9YmpLgSS3d18T983hDWDpO-0-e9406f1af3c51825cdbd4fe15b12e5e7)
注意:根据不同的编译器,整型常量的取值范围是不一样的。还有可能在16位的计算机中整型常量就为16位,在32位的计算机中整型常量就为32位。
在编写整型常量时,可以在整型常量的后面添加L或U进行修饰,L表示该常量是长整型,U表示该常量是无符号整型,例如:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_33_5.jpg?sign=1739349071-yPvgd7jcR9SB3apr9F88qvyXGrOMZq6q-0-1b57c2edf18b31f41b908cc534fea3fa)
注意:表示长整型和无符号整型的后缀L和U不区分大小写。
所有整型常量可以通过3种形式进行表示,分别为八进制、十进制和十六进制,下面分别进行介绍。
1.八进制
使用的数据表达形式是八进制,需要在整型常量前加上0进行修饰。八进制所包含的数字是0~7,例如:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_34_1.jpg?sign=1739349071-UIdMo7kFozhD498ZdNfPf4kEEOMIUnqt-0-f1121a4a95e9582657c81b4cf6e80e8d)
以下是八进制的错误写法:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_34_2.jpg?sign=1739349071-tNsTMCBw56nd13Ku3tKgkyz4wACRq5ZC-0-46f1d4f8fcb86e3fe224013be181e6a1)
2.十六进制
整型常量前面使用0x作为前缀(需要注意的是0x中的0是数字0,而不是字母O),表示该整型常量是用十六进制进行表示的。十六进制所包含的数字是0~9及字母A~F,例如:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_34_3.jpg?sign=1739349071-HXrWYCBYKg5RGw06nHO1DZCXMtg3EEIT-0-9ee39a32e16bd21a693917ec6096b6dc)
注意:其中字母A~F不区分大小写。
3.十进制
十进制是不需要在整形常量前面添加前缀的。十进制所包含的数字是0~9,例如:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_34_4.jpg?sign=1739349071-WTOBWRz9VJVtdf9aWQ8enkfrZlmhupsx-0-2c709a12476e959c039d3e29a5dd81af)
整型数据都是以二进制的方式存储在计算机的内存中,其数值是以补码的形式进行表示的。正数的补码与其原码的形式相同,负数的补码是将该数绝对值的二进制形式按位取反再加1。例如,一个十进制数11在计算机内存中的表现形式如图2.6所示。
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_34_5.jpg?sign=1739349071-aZlL0AthDTP4KBPYVwYWC1qMrbmuBQn2-0-a807028e88539529b6fc6160e45e39b7)
图2.6 十进制数11在计算机内存中的表现形式
如果是-11,那么在内存中又是怎样的呢?因为是以补码进行表示的,所以负数要先将其绝对值求出,然后进行取反操作,得到取反后的结果如图2.7所示。
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_34_6.jpg?sign=1739349071-hWaOrftrNJXssX8SbbkgVr4NwqFCM9w2-0-cc6e3c74f0248a0942d8a9e7763433fe)
图2.7 进行取反操作
取反之后还要进行加1操作,这样就得到最终的结果。-11在计算机内存中存储的形式如图2.8所示。
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_34_7.jpg?sign=1739349071-R3toyFtu6TkWroMETtkkD0OjVORRnwRY-0-e01a8320d762f309c8a8c0be7b76b63b)
图2.8-11在计算机内存中存储的形式
注意:对于有符号整数来说,其在内存中存储的最左侧一位表示符号位,如果该位为0,则说明该数为正数;如果该位为1,则说明该数为负数。
注意:在 Windows 操作系统中,选择“开始”→“附件”→“计算器”命令,弹出“计算器”对话框,可以使用“计算器”对话框进行八进制、十进制和十六进制之间的转换。这里需要注意的是,要选用程序员计算器,其方法是,选择“查看”→“程序员”命令,显示的“计算器”对话框样式如图2.9所示。
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_35_1.jpg?sign=1739349071-aUBjrXRia8UHDwY3Hpzk4qs6x6V8OLmU-0-1d2670cff363030d7b40bf20cdca3bee)
图2.9 “计算器”对话框
2.2.2 实型常量
实型常量也称为浮点型常量,它是由整数部分和小数部分组成的,并且用十进制的小数点进行隔开,如图2.10所示的超市小票中的应付金额“1.80”就是实型常量。
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_35_2.jpg?sign=1739349071-qtF7b0P0HWjvcChKvBRSnHEcxlmFVsb1-0-65ff42ce72243d8d716288d567db6f9a)
图2.10 实型常量
在C++中表示实型常量的方式有以下两种。
1.科学计数方式
科学计数方式是使用十进制的小数方法描述实型常量的,例如:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_35_3.jpg?sign=1739349071-hs5JrjHdYnWen36sLUxhtHjUv5qhcLM7-0-6bafcd56decd9e579b463d6eb9e0aeed)
2.指数方式
有时实型常量非常大或非常小,使用科学计数方式不利于用户观察,这时可以使用指数方式表示实型常量。其中,使用e或E进行指数显示,如514e2表示的是51400,而514e-2表示的是5.14。使用指数方式显示SciNum1和SciNum2,例如:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_35_4.jpg?sign=1739349071-hki8GEKAxhHSSI6Zdrrms5PYSzSkJ1mm-0-7b47bd2ec31bc3510d4efd665540d442)
在编写实型常量时,可以在实型常量的后面添加 F 或L 进行修饰,F 表示该常量是单精度类型,L表示该常量是长双精度类型,例如:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_36_1.jpg?sign=1739349071-Pb0m9cJhQm162ebmxYAsexlyLiyafHFZ-0-af064a372c0e23b3de2166ce3900b032)
注意:如果不在实型常量后面添加后缀,在默认状态下,实型常量为双精度类型;在实型常量后面添加的后缀不区分大小写。
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'表示换行等。
转义字符应用,代码如下:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_36_2.jpg?sign=1739349071-OpKOgj3cNBbgVbTnq31WPUI0ohZnjGAi-0-cf9013929d47e1c870d81f7aab6edc4c)
程序运行结果如图2.11所示。
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_36_3.jpg?sign=1739349071-DQVhSBaoFxFKHg7I1tqPZgv092L6BsfE-0-cb96f0c767cf7e50152d38e906c963dc)
图2.11 转义字符应用
转义字符是特殊的字符常量,使用时以字符“\”表示开始转义,转义字符说明如表2.2所示。
表2.2 转义字符说明
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_36_4.jpg?sign=1739349071-ygiHDjrYZc0Y4FQzKT6UYUEWQ7RpkEcm-0-3b77aca0b8f8b8c458cc604f04f2aa35)
续表
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_37_1.jpg?sign=1739349071-iEIwMfRYhDMsoTFxLBsmWbA4rlgXmdf0-0-5e6fcec8200f1b1a5b689fbacd9ac9e3)
2.2.4 字符串常量
字符串常量是用一组双引号括起来的若干个字符序列,如"ABC"、"abc"、"1314"和"您好"等都是正确的字符串常量。
如果在字符串常量中一个字符都没有,则将其称为空字符串,此时字符串的长度为0,如""。
在C++中存储字符串常量时,系统会在字符串的末尾自动添加一个“\0”作为字符串的结束标志,如字符串“welcome”在内存中的存储形式如图2.12所示。
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_37_2.jpg?sign=1739349071-ZiJmjxerLl6PzKUJziUxTsXiXY2SRZda-0-7a1f31e3eadcb568b9fe090f14685a8f)
图2.12 字符串“welcome”在内存中的存储形式
注意:在C++程序中编写字符串常量时,不必在一个字符串的结尾处添加“\0”结束标志,系统会自动添加“\0”结束标志。
前面介绍了有关字符常量和字符串常量的内容,它们之间的区别主要表现在以下几方面。
(1)定界符的使用不同。字符常量使用的是单引号,而字符串常量使用的是双引号。
(2)长度不同。字符常量只能有一个字符,也就是说字符常量的长度是1。字符串常量的长度可以是0。但是需要注意的是,即使字符串常量中的字符只有1个,长度却不是1。如字符串常量“H”,其长度为2,如图2.13所示为字符串常量“H”在内存中的存储方式。
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_37_3.jpg?sign=1739349071-aFX2POp13zeVqfIskXBiLAvWfMq98ATs-0-d69562db40327bd69c6bbe30c25fde3a)
图2.13 字符串常量“H”在内存中的存储方式
(3)存储的方式不同。在字符常量中存储的是字符的ASCII码值,如“A”的ASCII值为65,“a”的ASCII值为97。在字符串常量中,不仅要存储有效的字符,还要存储结尾的结束标志“\0”。
注意:系统会自动在字符串的末尾添加一个字符串的结束标志“\0”,这也就是字符串常量“H”的长度是2的原因。
上文简单介绍了有关ASCII码表的内容,那么ASCII码表是什么呢?在C++中,所使用的字符被一一映射到一个表中,这个表被称为ASCII码表,如表2.3所示。
表2.3 十进制的ASCII码表
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_38_1.jpg?sign=1739349071-Amfx7DWBRzVU8MKYdmHzzS5iKVnnQ7aA-0-92124d8c84cfb0aa78f05600155c93d2)
续表
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_39_1.jpg?sign=1739349071-SfmEG8fAizk779j2n1lIe6nRiXTc5JCJ-0-7f75e895eaae36b095f7e37bcb5478c4)
2.2.5 其他常量
常量除包括整型常量、浮点型常量、字符常量和字符串常量外,还包括布尔常量、枚举常量、宏定义常量等。
● 布尔(bool)常量:布尔常量只有两个,一个是true,表示真;另一个是false,表示假。
● 枚举常量:在枚举型数据中定义的成员也都是常量,这将在后文介绍。
● 宏定义常量:通过#define宏定义的一些值也是常量,例如:
![](https://epubservercos.yuewen.com/5F7BC7/26764105801618006/epubprivate/OEBPS/Images/38368-1_39_2.jpg?sign=1739349071-bMS2MJB5SOr5SxkvjhiJuK6y0h5sO4B4-0-2437e1f33392d0bc7eb32a68d7cc02b5)
其中,PI就是常量。