int main()
{
char* str1 = "Tom's cat";
char* str2 = "Tom\'s cat";
}
代码可以用 VS 2015 编译。
我只是好奇:
这两种方式都符合 C 和/或 C++ 标准吗?
int main()
{
char* str1 = "Tom's cat";
char* str2 = "Tom\'s cat";
}
代码可以用 VS 2015 编译。
我只是好奇:
这两种方式都符合 C 和/或 C++ 标准吗?
来自C++11 ISO Standard
§ 2.14.5 字符串文字[lex.string]
...
15非原始字符串文字中的转义序列和通用字符名称与字符文字 (2.14.3) 中的含义相同,除了单引号 ' 可以单独表示或由转义序列 \'</p >
是的,在字符串文字中,两者都是相同的。
字符文字需要转义版本:
char x = '\'';
标准参考有两个来源。首先,翻译阶段。从 C.11 §5.1.1.2 (C++.11 [ lex.phases ] 有类似的语言):
- 字符常量和字符串文字中的每个源字符集成员和转义序列都被转换为执行字符集的相应成员;如果没有对应的成员,则将其转换为除空(宽)字符之外的实现定义的成员。
接下来是字符常量和字符串文字的语法定义,它们允许转义序列。而simple-escape-sequence是语法中的转义序列。C.11 §6.4.4.4 对其进行了定义(C++.11 [ lex.ccon ] 具有相同的定义):
简单转义序列:其中之一
\' \" \? \\ \a \b \f \n \r \t \v
最后,对于字符串文字,标准指定文字中字符的解释与每个都是字符常量相同,然后将'
. 从 C.11 §6.4.5 (C++.11 [ lex.string ] 有类似的语言):
相同的考虑适用于字符串文字中序列的每个元素,就好像它在整数字符常量(对于字符或 UTF-8 字符串文字)或宽字符常量(对于宽字符串文字)中一样,除了单引号
'
可以通过自身或转义序列表示\'
,但双引号 " 应由转义序列表示\"
。
\'
是 C 和 C++ 中的有效字符转义序列。因此,线条
char* str1 = "Tom's cat";
char* str2 = "Tom\'s cat";
在 C 和 C++ 中生成等效的字符串文字。
是的,它们是相同的。
来自 c++ 标准,$2.13.3/7 字符文字 [lex.ccon]
表 6 — 转义序列
new-line NL(LF) \n horizontal tab HT \t vertical tab VT \v backspace BS \b carriage return CR \r form feed FF \f alert BEL \a backslash \ \\ question mark ? \? single quote ’ \’ double quote " \" octal number ooo \ooo hex number hhh \xhhh