字面值常量(literal),顾名思义,其值一望而知。
每个字面值都对应一种数据类型,其形式和值决定了它的数据类型。
下面讲讲C++中的各种字面值类型:
一、整形和浮点型字面值
1.整形字面值可以写成十进制数、八进制数或十六进制数的形式。
以0开头的整数代表八进制数:024 (代表十进制数20)
以0x或0X开头的整数代表十六进制数:0x14或0X14(代表十进制数20)
而20,则表示的是十进制数。
默认情况下,十进制字面值是带符号数,而八进制和十六进制字面值既可能是带符号的也可能是无符号的。十进制字面值类型是int、long、long long中能匹配的尺寸最小的那个。八进制和十六进制字面值的类型是能容纳其数值的int 、unsigned int、long、unsigned long、long long 和unsigned long long 中尺寸最小的那个。
注意:上面说的是能容纳其数值的而非能容纳其字面值的,因为严格来说,整形字面值可以存储在带符号的数据类型中,但字面值不会是负的,例如-42,负号并不在字面值之内,它的作用仅仅是对字面值取负值而已。
short没有对应的字面值。
2.浮点型字面值是一个double,可以给字面值加个后缀以表示其他浮点型,加后缀f或F,表示float,加l或L(最好用大写L,因为编程中1和L容易混淆),则表示long double。
例如 3.14159是double类型,而3.14159F是float类型,3.14159L,则是long double类型。
二、字符和字符串字面值
由单引号括起来的一个字符称为char型字面值(字符字面值),双引号括起来的零个或多个字符则构成字符串字面值。
实际上,字符串字面值的类型是由常量字符构成的数组。编译器在每个字符串的结尾处添加一个空字符(’\0’),所以,字符串字面值的实际长度要比它的内容多1。例如,字面值’A’表示单独的字符A,而字符串”A”则表示一个字符A和一个空字符。
如果两个字符串字面值的位置紧邻且仅由空格、缩进、和换行符分隔,则它们实际上是一个整体。例如:当一个字符串太长时,可以采用分开书写的方式:
std::cout << "a really,really long string literal "
"that spans two lines" << std::endl;
三、转义序列
1.C++中有两类字符程序员不能直接使用:一类是不可打印的字符,如退格、制表符或其他控制字符,因为它们没有可视的图符;另一类是有特殊含义的字符,如单引号、双引号、问号、反斜线等。在这种情况下,想要使用上述两类字符,就需要用转义字符。
转义字符以反斜线\作为开始:
换行符:\n 制表符:\t 响铃:\a
纵表符:\v 退格符:\b 双引号:\”
反斜线:\ 问号:\? 单引号:\’
回车符:\r 进纸符:\f
std::cout << "\tHi!\n" << std::endl;//打印出一个制表符,输出Hi!,转到新一行。
2.泛化转义序列
泛化转义序列形式是一个\x后紧跟一个或多个十六进制数字,或者\后面紧跟1个、2个或3个八进制数字,其中数字部分表示字符对应的数值。
假设使用的是lantin-1字符集:
\7 (响铃) \12(换行符) \40(空格)
\0(空字符) \115(字符M) \x4d(字符M)
07(十进制数值为7)在ASCII码中对应控制字符BEL(响铃);012(十进制数值为10)在ASCII码中对应控制字符LF(换行符);040(十进制数值为32)在ASCII码中对应控制字符SP(空格符);0则在ASCII码中对应控制字符NUL(空字符);0115和0x4d(十进制数值都为77),在ASCII码中对应字符M。
注意:如果反斜线\后面的八进制数超过3个,只有前面三个数字和\构成转义序列,例如,”\1234”表示两个字符,即八进制数0123对应的字符和字符4。而相反的,\x要用到后面跟着的所有数字,例如”\x1234”表示一个16位的字符(4×4),该字符用这四个十六进制数所对应的比特唯一确定。同时也该注意的是,大多数机器的char型数据战8位,所以上面的例子可能会出错。
一般来说,超过8位的十六进制字符都是与某个前缀作为开头的扩展字符集一起使用的。
加前缀u Unicode 16 字符 char16_t类型
加前缀U Unicode 32 字符 char32_t类型
加前缀L 宽字符 wchar_t类型
加前缀u8 utf-8字符(仅用于字符串字面值常量) char类型(8位编码一个Unicode字符)
三、指定字面值的类型
前面也有提到过,通过添加前缀和后缀,可以改变整形、浮点型和字符型字面值的默认类型。
浮点型和字符、字符串字面值前面有所讲到、这里再讲下整形字面值的。
对于一个整形字面值来说,我们能分别指定它是否带符号以及占用多少空间。
i.如果加了后缀U或u,则该字面值属于无符号类型,以U或u为后缀的十进制数、八进制数和十六进制数都将从unsigned int、unsigned long、unsigned long long中选择能匹配的 空间最小的一个作为其数据类型。
ii.如果加了后缀l或L,则字面值的类型至少是long,可以是long、unsigned long、 long long、unsigned long long 中的最合适的一种。
iii.如果加了后缀ll或 LL,则字面值类型可以是long long 或 unsigned long long 中的一种。
iv.当然,我们也可以将U和L和LL混合使用,例如,以UL为后缀的字面值将是unsigned long 或 unsigned long long 中最合适的一种。
四、布尔字面值和指针字面值
true 和 false 是布尔类型的字面值,nullptr则是指针字面值。