fbpx
维基百科

三字符组与双字符组

三字符组(trigraph)与双字符组(Digraph)是程序设计语言(如C语言)中3个或者2个字符的序列,在编译器预扫描源程序时被替换为单个字符。以解决某些键盘不能输入某些编程必须的字符问题。

缘起

C语言的源程序的最低必须的字符集是基于7位ASCII码字符集,是ISO 646-1983 Invariant Code Set的一个超集。ISO 646最初是1972年颁布的一项国际化的7位ASCII标准,规定了12个字符所对应的码位保持对各国标准开放:# $ @ [ \ ] ^ ` { | } ~

因为法国标准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个字符

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

如果希望在源程序中有两个连续的问号,且不希望被预处理器替换,这种情况出现在字符常量、字符串字面值或者是程序注释中,可选办法是用字符串的自动连接:"...?""?..."或者转义序列"...?\?..."

Microsoft Visual C++ 2010版开始,该编译器默认不再自动替换三字符组。如果需要使用三字符组替换(如为了兼容古老的软件代码),需要设置编译器命令行选项/Zc:trigraphs

g++仍默认支持三字符组,但会给出编译警告。

双字符组

1994年公布了一项C语言标准的修正案,引入了更具有可读性的5个双字符组。这也包括进了C99标准。

双字符组 替换为
<: [
:> ]
<% {
%> }
%: #

不同于三字符组在源文件的任何出现都会被预处理器替换,双字符如果出现在字符串字面值(quoted string)、字符常量、程序注释中将不被替换。双字符组的替换发生在编译器对源程序的tokenization阶段(即识别出关键字、标识符等,类似于自然语言的“断词”),仅当双字符组作为一个token或者token的组成部分时(如%:%:被替换为预处理运算符##),双字符组才被替换为单字符。

g++支持上述双字符组替换。但Microsoft Visual C++不支持双字符组替换。

C++

C++标准支持C语言的三字符组与双字符组(包括C99中的增补)。C++自身还提供了下述内置的关键字:

关键字 等价于
and 
&& 
bitor 
| 
or 
|| 
xor 
^ 
compl 
~ 
bitand 
& 
and_eq 
&= 
or_eq 
|= 
xor_eq 
^= 
not 
! 
not_eq 
!= 

Microsoft Visual C++编译器要求如果使用上述关键字,必须包含头文件ciso646,否则编译报错。如“ error C2065: 'not' : undeclared identifier”。而g++编译器就不要求包含头文件ciso646

三字符组与双字符组, 此條目没有列出任何参考或来源, 2017年3月20日, 維基百科所有的內容都應該可供查證, 请协助補充可靠来源以改善这篇条目, 无法查证的內容可能會因為異議提出而被移除, 三字符组, trigraph, 与双字符组, digraph, 是程序设计语言, 如c语言, 中3个或者2个字符的序列, 在编译器预扫描源程序时被替换为单个字符, 以解决某些键盘不能输入某些编程必须的字符问题, 目录, 缘起, 三字符组, 双字符组, 缘起, 编辑c语言的源程序的最低必须的字符集是基于7位ascii码字符集,. 此條目没有列出任何参考或来源 2017年3月20日 維基百科所有的內容都應該可供查證 请协助補充可靠来源以改善这篇条目 无法查证的內容可能會因為異議提出而被移除 三字符组 trigraph 与双字符组 Digraph 是程序设计语言 如C语言 中3个或者2个字符的序列 在编译器预扫描源程序时被替换为单个字符 以解决某些键盘不能输入某些编程必须的字符问题 目录 1 缘起 2 三字符组 3 双字符组 4 C 缘起 编辑C语言的源程序的最低必须的字符集是基于7位ASCII码字符集 是ISO 646 1983 Invariant Code Set的一个超集 ISO 646最初是1972年颁布的一项国际化的7位ASCII标准 规定了12个字符所对应的码位保持对各国标准开放 因为法国标准AFNOR NF Z 62010 1982把码位0x7c ASCII码的 定义为u 用法文键盘就难以输入C语言的位或运算符 码位0x7e ASCII码的 定义为 即分音符 法文键盘就难以输入C语言的位非运算符 加拿大法语标准CSA Z243 4 1985中把码位0x5e ASCII码的 在定义为E 导致难以输入C语言的异或运算符 三字符组 编辑为解决上述的C语言源代码输入问题 C语言标准规定预处理器 C preprocessor 在扫描处理C语言源文件时 替换下述的3字符出现为1个字符 三字符组 替换为 lt gt 如果希望在源程序中有两个连续的问号 且不希望被预处理器替换 这种情况出现在字符常量 字符串字面值或者是程序注释中 可选办法是用字符串的自动连接 或者转义序列 从Microsoft Visual C 2010版开始 该编译器默认不再自动替换三字符组 如果需要使用三字符组替换 如为了兼容古老的软件代码 需要设置编译器命令行选项 Zc trigraphsg 仍默认支持三字符组 但会给出编译警告 双字符组 编辑1994年公布了一项C语言标准的修正案 引入了更具有可读性的5个双字符组 这也包括进了C99标准 双字符组 替换为 lt gt lt gt 不同于三字符组在源文件的任何出现都会被预处理器替换 双字符如果出现在字符串字面值 quoted string 字符常量 程序注释中将不被替换 双字符组的替换发生在编译器对源程序的tokenization阶段 即识别出关键字 标识符等 类似于自然语言的 断词 仅当双字符组作为一个token或者token的组成部分时 如 被替换为预处理运算符 双字符组才被替换为单字符 g 支持上述双字符组替换 但Microsoft Visual C 不支持双字符组替换 C 编辑C 标准支持C语言的三字符组与双字符组 包括C99中的增补 C 自身还提供了下述内置的关键字 关键字 等价于and amp amp bitor or xor compl bitand amp and eq amp or eq xor eq not not eq Microsoft Visual C 编译器要求如果使用上述关键字 必须包含头文件ciso646 否则编译报错 如 error C2065 not undeclared identifier 而g 编译器就不要求包含头文件ciso646 取自 https zh wikipedia org w index php title 三字符组与双字符组 amp oldid 64842544, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。