You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中'?'与'\?'输出相同的原因是什么?

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

这其实是C语言标准里规定的一个特殊规则——\?是一个合法但冗余的转义字符,它最终会被编译器解析为普通的问号?本身,所以两段代码里的c变量实际存储的都是同一个字符,输出自然一致。

背后的原因:三字符序列(Trigraphs)

C语言早期为了兼容一些缺少特定符号的键盘,引入了三字符序列的机制:由三个连续的问号开头的组合,会被替换成对应的特殊字符。比如:

  • ??( → [
  • ??) → ]
  • ??! → |
  • ??' → ^
  • 还有其他几个类似的组合

为了避免在某些场景下,单个问号被误组合成三字符序列,C语言允许用\?来表示独立的问号。这样编译器看到\?时,就会知道这是一个单独的问号,不会尝试和后面的字符拼接成三字符序列。

举个实际的例子:

#include <stdio.h>
int main(void) {
    printf("What??!\n");   // 某些编译器会把??!解析成|,输出What|!
    printf("What\?!\n");   // 用\?避免解析,输出What?!
    return 0;
}

回到你的代码

当你单独定义const char c='\?';时,因为这个问号后面没有其他字符可以组成三字符序列,所以编译器直接将\?等价于?处理,变量c存储的ASCII值就是问号的ASCII码(0x3F)。这和直接写const char c='?';完全没有区别,所以printf("%c", c)的输出自然一样。

内容的提问来源于stack exchange,提问作者Krish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:13:54