C ++字符串文字

时间:2011-03-30 13:05:14

标签: c++

为什么这段代码会编译?

std::string a = "test"
"a";

我知道“如果缺少\且在字符串中被忽略,那么:

std::string a = "test""a";

将与“testa”相同,但是当我在其中有空格/制表符/行尾时编译为什么?

5 个答案:

答案 0 :(得分:9)

也忽略了相邻字符串文字之间的空格(“空格/制表符/行尾”,如你所说)。

由于您想知道这是否是标准的,C ++标准说:

<强> 2.1 [lex.phases] / 3

  

源文件被分解为预处理标记(2.4)和空白字符序列

<强> 2.1 [lex.phases] / 6

  

连接相邻的普通字符串文字标记。

空白字符 2.4 [lex.pptoken] / 2 中定义为

  

空格,水平制表符,换行符,垂直制表符和换页符

此外, 2.13.4 [lex.string] / 3 中提供的此类连接示例涉及空格:

[Example:
"\xA" "B"
contains the two characters ’\xA’ and ’B’ after concatenation 

表示在这种情况下“相邻令牌”的含义包括“由空格分隔”,因此,“由一系列空白字符分隔”,也包括新行。

答案 1 :(得分:4)

因为C ++语法不关心标记之间的换行符,制表符或空格(尽可能)。

这与以下内容非常相似:

int a = 3 +
        5 +
        9;

有效。

(当然,你经常需要在代币之间使用一些空格来区分它们,例如int a;而不是inta;。但只要不需要区分,空白无关紧要,例如3 + 53+5。)

答案 2 :(得分:2)

这是设计所以你可以拥有

std::string a = "really"
                "long"
                "string literals"
                "spread over multiple lines";

答案 3 :(得分:1)

编译器非常智能,可以为您优化。

C ++忽略语句中的行尾 - 分号确定语句何时完成。

答案 4 :(得分:1)

忽略空格 - 分号结束你的行。