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