C++ 为什么是“\”&引用;C/C+中的转义序列+;?

C++ 为什么是“\”&引用;C/C+中的转义序列+;?,c++,c,string,gcc,escaping,C++,C,String,Gcc,Escaping,在C/C++中有四个特殊的非字母字符需要转义:单引号\'、双引号\“、反斜杠\、问号\?。这显然是因为它们有特殊的含义。'对于单引号字符,对于字符串文本,\对于转义序列,但为什么是其中之一 我今天读了一本教科书中的转义序列表,我意识到我以前从未转义过?,也从未遇到过问题。为了确定这一点,我在GCC下进行了测试: #include <stdio.h> int main(void) { printf("question mark ? and escaped \?\n");

在C/C++中有四个特殊的非字母字符需要转义:单引号
\'
、双引号
\“
、反斜杠
\
、问号
\?
。这显然是因为它们有特殊的含义。
'
对于单引号
字符
对于字符串文本,
\
对于转义序列,但为什么
是其中之一

我今天读了一本教科书中的转义序列表,我意识到我以前从未转义过
,也从未遇到过问题。为了确定这一点,我在GCC下进行了测试:

#include <stdio.h>
int main(void)
{
    printf("question mark ? and escaped \?\n");
    return 0;
}
#包括
内部主(空)
{
printf(“问号?和转义\?\n”);
返回0;
}

和C++版本:

#include <iostream>
int main(void)
{
    std::cout << "question mark ? and escaped \?" << std::endl;
    return 0;
}
#包括
内部主(空)
{
标准::cout
为什么
\?
是转义序列字符之一

因为它是特殊的。答案导致,C/C++预处理器将以下三个字符序列替换为相应的单个字符。(C11§5.2.1.1和C++11§2.3)

如果未转义
,则输出将是
|

有关三角图的详细信息,请参见


为什么不转义
工作正常。甚至没有警告

因为
(和双引号
)可以用标准来表示:

C11§6.4.4.4第4节字符常数 双引号
和问号
可以通过自身或转义序列来表示\“
\?
,但单引号
'
和反斜杠
\
应分别由转义序列
\'
\
表示

在C++中类似:

C++11§2.13.2字符文字第3节 某些非图形字符,单引号
、双引号
、问号
、反斜杠
\
,可根据表6表示。双引号
和问号
可表示为自身或转义序列
\"
\?
分别,但是单引号
'
和反斜杠
\
应分别由转义序列
\'
\
表示。如果反斜杠后面的字符不是指定的字符之一,则行为未定义。转义序列指定单个字符演员


我不确定是否有其他编译器,但默认情况下,
gcc
忽略有向图和三向图。@devnull True,我在自己的回答中也说了同样的话。:)我后来看到了,并对此进行了评论。从回答:
这就是为什么转义序列“\?”被识别(作为一个简单的问号-虽然可能是“?/?”).
行:
例如,gcc默认情况下不支持trigraph,除非启用了选项-trigraphs。在这种选项下,\?在某些情况下是有用的:
是误导性的。似乎可以说,即使您不使用
-trigraphs
选项,gcc也会将
??!
解释为
\124;
@devnull:许多人都会这样做禁用gnu语言变体,例如
-std=c++98
-std=c99
,因此启用trigraph支持非常常见。双引号
“U/CODE”是由它自己表示的吗?在没有逃脱的情况下,如何在字符串的中间键入双引号?@ L*UVX.NHPHC。标准是明确的:字符常量可以是一个转义序列,也可以是“源字符集的任何成员,除了单引号”、“反斜杠”或“新行字符”。。字符串文字的字符可以是转义序列或“源字符集的任何成员,除了双引号”、“反斜杠”或新行字符”。我不认为三角图“现在几乎没用了”“。据我所知,在生产代码中寻找三角图的任何用途的努力都没有在编译器测试套件、三角图如何工作的演示等之外找到任何故意的用途。这听起来像是一个更准确(也许不那么外交)的声明。”“一个从来没有真正有用过的特性,一开始就不应该出现在语言中”。
Trigraph:       ??(  ??)  ??<  ??>  ??=  ??/  ??'  ??!  ??-
Replacement:      [    ]    {    }    #    \    ^    |    ~
printf("\?\?!\n");