C语言的三字母词(trigraphs)
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
即可。