类似42 这样的值,在程序中被当作字面值常量。称之为字面值是因为只能用它的值称呼它, 称之为常量是因为它的值不能修改。每个字面值都有相应的类型,例如:0 是 int 型,3.14159 是 double 型。只有内置类型存在字面值,没有类类型的字面值。因此,也没有任何标准库类型的字面值。

整型字面值规则

定义字面值整数常量可以使用以下三种进制中的任一种:十进制、八进制和十六进制。 当然这些进制不会改变其二进制位的表示形式。例如,我们能将值 20定义成下列三种形式中的任意一种:

20 //二进制
024 //八进制
0x14 //十六进制

以 0(零)开头的字面值整数常量表示八进制,以 0x 或 0X 开头的表示十六进制。

字面值整数常量的类型默认为 int 或 long 类型,没有 short 类型的字面值常量。其精度类型决定于字面值——其值适合 int 就是 int 类型,比 int 大的值就是 long 类型。

通过增加后缀,能够强制将字面值整数常量转换为 long、unsigned 或 unsigned long类型。通过在数值后面加 L 或者 l指定常量为 long 类型。

类似地, 可通过在数值后面加 U 或 u 定义 unsigned 类型。 同时加 L 和 U就能够得到 unsigned long 类型的字面值常量。但其后缀不能有空格:

128u /* unsigned */ 1024UL /* unsigned long*/
1L /* long */   8Lu /* unsigned long*/
浮点字面值规则

通常可以用十进制或者科学计数法来表示浮点字面值常量。使用科学计数法时,指数用 E 或者 e 表示。默认的浮点字面值常量为 double 类型。在数值的后面加上 F 或 f 表示单精度。同样加上 L 或者 l 表示扩展精度。

下面每一组字面值表示相同的值:

3.14159F       .001f        12.345L       0.
3.14159E0f     1E-3F     1.2345E1L       0e0
布尔字面值和字符字面值

true 和 false 是布尔型的字面值:

bool test = false;

可打印的字符型字面值通常用一对单引号来定义:

'a'   '2'   ','     '  ' // blank

这些字面值都是 char 类型的。在字符字面值前加 L 就能够得到 wchar_t

类型的宽字符字面值。如:

L'a'

非打印字符的转义序列

有些字符是不可打印的。不可打印字符实际上是不可显示的字符,比如退格或者控制符。还有一些在语言中有特殊意义的字符,例如单引号、双引号和反斜线符号。不可打印字符和特殊字符都用转义字符书写。转义字符都以反斜线符号开始,C++ 语言中定义了如下转义字符: 

换行符

\n

水平制表符

\t

纵向制表符

\v

退格符

\b

回车符

\r

进纸符

\f

报警(响铃)符

\a

反斜线

\\

疑问号

\?

单引号

\'

双引号

\"

 

 

字符串字面值

字符串字面值常量用双引号括起来的零个或者多个字符表示。不可打印字符表示成相应的转义字符。

为了兼容 C 语言,C++ 中所有的字符串字面值都由编译器自动在末尾添加一个空字符。

'A'        //表示单个字符 A
"A"        //表示包含字母 A 和空字符两个字符的字符串。

正如存在宽字符字面值,如:

L'a'

也存在宽字符串字面值,一样在前面加“L”,如:

L"a wide string literal"

宽字符串字面值是一串常量宽字符,同样以一个宽空字符结束。

字符串字面值的连接

两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字面值。这使得多行书写长字符串字面值变得简单:

std::cout << "a multi-line "
              "string literal "
              "using concatenation"
              << std::endl;

执行这条语句将会输出:

a multi-line string literal using concatenation

如果连接字符串字面值和宽字符串字面值:

std::cout << "multi-line " L"literal " << std::endl;

其结果是未定义的,也就是说,连接不同类型的行为标准没有定义。这个程序可能会执行,也可能会崩溃或者产生没有用的值,而且在不同的编译器下程序的动作可能不同。

多行字面值

处理长字符串有一个更基本的(但不常使用)方法,这个方法依赖于很少使用的程序格式化特性: 在一行的末尾加一反斜线符号可将此行和下一行当作同一行处理。

C++ 的格式非常自由。特别是有一些地方不能插入空格,其中之一是在单词中间。特别是不能在单词中间断开一行。但可以通过使用反斜线符号巧妙实现:

std::cou\
t << "Hi" << st\
d::endl;

等价于

std::cout << "Hi" << std::endl;

注意反斜线符号必须是该行的尾字符——不允许有注释或空格符。同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,长字符串字面值的后继行才不会有正常的缩进。