为什么这段代码会编译?
std::string a = "test"
"a";
我知道“如果缺少\且在字符串中被忽略,那么:
std::string a = "test""a";
将与“testa”相同,但是当我在其中有空格/制表符/行尾时编译为什么?
答案 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 + 5
或3+5
。)
答案 2 :(得分:2)
这是设计所以你可以拥有
std::string a = "really"
"long"
"string literals"
"spread over multiple lines";
答案 3 :(得分:1)
编译器非常智能,可以为您优化。
C ++忽略语句中的行尾 - 分号确定语句何时完成。
答案 4 :(得分:1)
忽略空格 - 分号结束你的行。