为什么 '?' 和'\?' 在C中给出相同的输出?

Kri*_*ish 48 c escaping

在C中,为什么这两段代码会提供相同的输出?

#include<stdio.h>

int main(void)
{
    const char c='\?';
    printf("%c",c);
}
Run Code Online (Sandbox Code Playgroud)

#include<stdio.h>

int main(void)
{
    const char c='?';
    printf("%c",c);
}
Run Code Online (Sandbox Code Playgroud)

我知道当我们使用printf()时,反斜杠用于为编译器生成引号("')和反斜杠,但为什么这对'?'有效?

Bat*_*eba 86

\?是一个完全等价的转义序列?,用于转义三字符:

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

  • 值得一提的是:_trigraphs_用于编写在用于使用C源代码的特定字符集中不存在的字符.三字形符合`??`加上另一个字符.`?? /`例如意味着\.因此,要在字符串文字中使用`?? /`,必须将其写为`?\?/`以防止解释为三字符. (29认同)
  • @PaulOgilvie - 当本地键盘没有特定字符时,也会使用三字符,即使它在当前字符编码中是可表示的. (9认同)
  • [可用三字母表示的字符](https://gcc.gnu.org/onlinedocs/cpp/Initial-processing.html)是````````````` `|``~`和反斜杠.该功能的最初基本原理是在[ISO 646的国家变体](https://en.wikipedia.org/wiki/ISO/IEC_646#Variant_comparison_chart)中使C更具实用性,并用其他重音字母替换这些字符. (3认同)
  • @zwol - 哦!我认为是程序员谴责地狱并被迫永久使用EBCDIC. (2认同)
  • @ Rakete1111,对我来说似乎是一个合适的向后兼容性措施.虽然很少使用三字母(导致它们被移除),但也许许多人被迫使用逃逸机制.删除转义会破坏之前用于转义三字符的所有代码. (2认同)

Aja*_*iya 29

引用C11,章节§6.4.4.4p4

双引号"和问号?是表示的或者通过它们自身或者通过转义序列\"\?分别,但....

强调我的

所以转义序列\?的处理方式与之相同?.


Som*_*ude 20

因为'\?'是有效的转义码,并且等于问号.