C4P持续更新中。

这次是看到转义字符列表里,对问号?也提供了转义序列\?,但是并没有解释其来由。当时就比较好奇,直接开了个源文件,试了一下,发现不论是printf还是cout,都直接正常地输出了问号字符。

后来在CSDN论坛上发现,有人也提出了相同的问题,下面的解答中提到了三字母词trigraphs这个概念。

以下介绍摘自中文wiki:

因为法国标准AFNOR NF Z 62010-1982把码位0x7c(ASCII码的 | )定义为ù,用法文键盘就难以输入C语言的位或运算符|;码位0x7e(ASCII码的~)定义为¨(即分音符),法文键盘就难以输入C语言的位非运算符~

加拿大法语标准CSA Z243.4-1985中把码位0x5e(ASCII码的^)在定义为É,导致难以输入C语言的异或运算符^

为解决上述的C语言源代码输入问题,C语言标准规定预处理器(C preprocessor)在扫描处理C语言源文件时,替换下述的3字符出现为1个字符:

三字符组 替换为
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

不过现在,各国经济水平发达了,这种问题只需要通过在键盘上多加几个按键就能解决(纯属口胡,有误欢迎指正),所以现在的编译器默认都不会开启三字母词,输入??=的输出也还是??=,不过会给出如下提示:

warning: trigraph ??= ignored, use -trigraphs to enable [-Wtrigraphs]

亦即,想要开启三字母词的话,在编译命令加上-trigraphs即可。

标签: none

添加新评论