为什么在C语言中'?'和'\?'输出相同?

48
在 C 语言中,为什么这两个代码片段会给出相同的输出?
#include<stdio.h>

int main(void)
{
    const char c='\?';
    printf("%c",c);
}

#include<stdio.h>

int main(void)
{
    const char c='?';
    printf("%c",c);
}

我知道在使用printf()时,反斜杠用于使引号("')和反斜杠对编译器明显,但为什么这也适用于'?'?


24
“反斜杠”用于转义引号,而不是使其成为引用。 - Pierre Arlaud
5个回答

86

\? 是等同于 ? 的转义序列,用于转义三字符组

#include <stdio.h>
int main(void) {
    printf("%s %s", "??=", "?\?="); // output is # ??=
}

29
值得一提的是:三字符组(trigraphs)用于编写在某个字符集中不存在的字符,以便编写C语言源代码。一个三字符组由??和另一个字符组成。例如,??/表示\。因此,在字符串文字中使用??/时,必须将其写为?\?/,以避免被解释为三字符组。 - Paul Ogilvie
9
三连字也会在本地键盘没有特定字符时使用,即使该字符可以在当前字符编码中表示。 - Pete Becker
3
可以用三字母组合表示的字符包括 [ ] { } # ^ | ~ 和反斜杠。最初引入这个特性的原因是为了使 C 语言在 ISO 646 的国家变种 中更加实用,这些变种用额外的带重音的字母替换了上述字符。 - zwol
2
@zwol - 哦!我以为这是给那些被判定永世使用EBCDIC的程序员们准备的。 - davidbak
2
@Rakete1111,这对我来说似乎是一种适当的向后兼容措施。尽管很少有人使用三字符序列(导致它们被移除),但许多人被迫使用转义机制。去掉转义会破坏所有以前用于转义三字符序列的代码。 - AnoE
显示剩余2条评论

29

引用自C11,第§6.4.4.4p4章:

双引号"和问号?可以直接表示,也可以使用转义序列\"\?来表示,但是...

强调为本人添加

因此,转义序列\??的处理方式相同。


20

因为'\?'是一个有效的转义代码,等同于问号。


0

当你定义一个charstring时,编译器会将该charstring中的反斜杠解析为转义序列。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接