5. 字符串字面值
之前见过的所有字面值都有基本内置类型。还有一种字面值——字符串字面值——更加复杂。字符串字面值是一串常量字符,这种类型将在4.3节详细说明。
字符串字面值常量用双引号括起来的零个或者多个字符表示。不可打印字符表示成相应的转义字符。
"Hello World!" // simple string literal "" // empty string literal "\nCC\toptions\tfile.[cC]\n" // string literal using newlines and tabs
|
为了兼容C语言,C++(www.cppentry.com)中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符字面值
'A' // single quote: character literal |
表示单个字符A,然而
"A" // double quote: character string literal |
表示包含两个字符的字符串:字母A和空字符。
正如存在宽字符字面值,如
也存在宽字符串字面值,一样在前面加“L”,如
宽字符串字面值是一串常量宽字符,同样以一个宽空字符结束。
6. 字符串字面值的连接
两个相邻的仅由空格、制表符或换行分开的字符串字面值(或宽字符串字面值)可连接成一个新字符串字面值。这使得多行书写长字符串字面值变得简单:
// concatenated long string literal std::cout << "a multi-line " "string literal " "using concatenation" << std::endl; |
执行这条语句将会输出:
a multi-line string literal using concatenation |
如果连接字符串字面值和宽字符串字面值,将会出现什么结果呢?例如:
// Concatenating plain and wide character strings is undefined std::cout << "multi-line " L"literal " << std::endl; |
结果是未定义的(undefined)——也就是说,没有定义标准的方法连接不同的类型。这个程序可能会执行,也可能会崩溃或者产生没有用的值,而且在不同的编译器下程序的动作可能不同。
建议:不要依赖未定义的操作
使用了未定义操作的程序都是错误的,如果程序能够运行,也只是巧合。未定义的操作源于编译器不能检测到的程序错误或太麻烦以至无法检测的错误。
不幸的是,含有未定义操作的程序在有些环境或编译器中可以正确执行,但并不能保证同一程序在不同编译器中甚至在当前编译器的后继版本中会继续正确运行,也不能保证程序在一组输入上可以正确运行且在另一组输入上也能够正确运行。
程序不应该依赖未定义的操作。
同样地,通常程序不应该依赖机器相关的操作,譬如假定int的位数是个固定且已知的值,这样的程序被认为是不可移植的(nonportable)。当程序移植到另一台机器上时,要寻找并更改任何依赖于机器相关的操作的代码。捕获以前可以运行的程序中的这类问题是一项非常不愉快的任务。
7. 多行字面值
处理长字符串有一个更基本的(但不常使用)方法,这个方法依赖于很少使用的程序格式化性质:在一行的末尾加一反斜线符号可将此行和下一行当作同一行处理。
正如1.4.1节提到的,C++(www.cppentry.com)的格式非常自由。特别是仅有一些地方不能插入空格,其中之一是在单词中间。特别是不可以在单词中间断开一行。但可以通过使用反斜线符号巧妙实现:
// ok: A \ before a newline ignores the line break std::cou\ t << "Hi" << st\ d::endl; |
等价于
std::cout << "Hi" << std::endl;
|
可以使用这个特性来编写长字符串字面值:
// multiline string literal std::cout << "a multi-line \ string literal \ using a backslash" << std::endl; return 0; } |
注意反斜线符号必需是该行的尾字符——不允许有注释或空格符。同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,长字符串字面值的后继行才不会有正常的缩进。
习题
习题2.7 解释下列字面值常量的不同之处。
(a) ’a’,L’a’,"a",L"a" (b) 10,10u,10L,10uL,012,0xC (c) 3.14,3.14f,3.14L |
习题2.8 确定下列字面值常量的类型:
(a) –10 (b) -10u (c) -10. (d) -10e-2 |
习题2.9 下列哪些(如果有)是非法的?
(a) "Who goes with F\145rgus \012" (b) 3.14e1L (c) "two" L"some" (d) 1024f (e) 3.14UL (f) "multiple line comment" |
习题2.10 使用转义字符,编写一段程序,输出2M,然后换行。修改程序,输出2,跟着一个制表符,然后是M,最后是换行符。
【责任编辑:
董书 TEL:(010)68476606】