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
相关产品推荐
相关产品推荐

