2.1.3 字面值常量(2)
我们可以像使用普通字符那样使用C++(www.cppentry.com)语言定义的转义序列:
- std::cout << "Hi \x4dO\115!\n"; //输出Hi MOM!,转到新一行
- std::cout << '\115' << '\n'; //输出M,转到新一行
注意,如果反斜线\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列。例如,"\1234"表示2个字符,即八进制数123对应的字符以及字符4。相反,\x要用到后面跟着的所有数字,例如,"\x1234"表示一个16位的字符,该字符由这4个十六进制数所对应的比特唯一确定。因为大多数机器的char型数据占8位,所以上面这个例子可能会报错。一般来说,超过8位的十六进制字符都是与表2.2中某个前缀作为开头的扩展字符集一起使用的。
指定字面值的类型
通过添加如表2.2中所列的前缀和后缀,可以改变整型、浮点型和字符型字面值的默认类型。
- L'a' // 宽字符型字面值,类型是wchar_t
- u8"hi!" // utf-8字符串字面值(utf-8用8位编码一个Unicode字符)
- 42ULL // 无符号整型字面值,类型是unsigned long long
- 1E-3F // 单精度浮点型字面值,类型是float
- 3.14159L // 扩展精度浮点型字面值,类型是long double
当使用一个长整型字面值时,请使用大写字母L来标记,因为小写字母l和数字1太容易混淆了。
表2.2:指定字面值的类型
|
表2.2:指定字面值的类型
|
|
字符和字符串字面值
|
|
前缀
|
含义
|
类型
|
|
u
|
Unicode 16字符
|
char16_t
|
|
U
|
Unicode 32字符
|
char32_t
|
|
L
|
宽字符
|
wchar_t
|
|
u8
|
Utf-8(仅用于字符串字面常量)
|
char
|
|
整型字面值
|
浮点型字面值
|
|
后缀
|
最小匹配类型
|
后缀
|
类型
|
|
u or U
|
unsigned
|
f或F
|
float
|
|
l or L
|
long
|
l或L
|
long double
|
|
ll or LL
|
long long
|
|
|
对于一个整型字面值来说,我们能分别指定它是否带符号以及占用多少空间。如果后缀中有U,则该字面值属于无符号类型,也就是说,以U为后缀的十进制数、八进制数或十六进制数都将从unsigned int、unsigned long和unsigned long long中选择能匹配的空间最小的一个作为其数据类型。如果后缀中有L,则字面值的类型至少是long;如果后缀中有LL,则字面值的类型将是long long和unsigned long long 中的一种。显然我们可以将U与L或LL合在一起使用。例如,以UL为后缀的字面值的数据类型将根据具体数值情况或者取unsigned long,或者取unsigned long long。
布尔字面值和指针字面值
true和false是布尔类型的字面值:
- bool test = false;
nullptr是指针字面值,2.3.2节(第52页)将有更多关于指针和指针字面值的介绍。
2.1.3节练习
练习2.5:指出下述字面值的数据类型并说明每一组内几种字面值的区别:
(a) 'a', L'a', "a", L"a"
(b) 10, 10u, 10L, 10uL, 012, 0xC
(c) 3.14, 3.14f, 3.14L
(d) 10, 10u, 10., 10e-2
练习2.6:下面两组定义是否有区别,如果有,请叙述之:
- int month = 9, day = 7;
- int month = 09, day = 07;
练习2.7:下述字面值表示何种含义?它们各自的数据类型是什么?
(a) "Who goes with F\145rgus \012"
(b) 3.14e1L (c) 1024f (d) 3.14L
练习2.8:请利用转义序列编写一段程序,要求先输出2M,然后转到新一行。修改程序使其先输出2,然后输出制表符,再输出M,最后转到新一行。