77

我今天了解到 C99 和 C++ 中有二合字母。以下是一个有效的程序:

%:include <stdio.h>

%:ifndef BUFSIZE
 %:define BUFSIZE  512
%:endif

void copy(char d<::>, const char s<::>, int len)
<%
    while (len-- >= 0)
    <%
        d<:len:> = s<:len:>;
    %>
%>

我的问题是:它们为什么存在?

4

4 回答 4

69

Digraphs 是为没有支持 ISO 646 字符集的键盘的程序员创建的。

http://en.wikipedia.org/wiki/C_trigraph

于 2009-01-11T06:14:00.143 回答
25

我相信它们的存在可以追溯到某个地方的可能性,有人正在使用带有操作系统的编译器,该操作系统的字符集非常陈旧,以至于它不一定具有 C 或 C++ 表达整个语言所需的所有字符.

此外,它还为IOCCC提供了良好的参赛作品。

于 2009-01-11T06:10:18.920 回答
15

我认为这是因为这个星球上的某些键盘可能没有像“#”和“{”这样的键。

于 2009-01-11T06:11:31.383 回答
11

C/C++ 中的二合字母和三合字母来自 CDC6000(60 位)、Univac 1108(36 位)、DECsystem 10 和 20 个系统(36 位)使用的六位字符集的时代,每个系统都使用专有的 64 位字符设置不兼容 ASA X3.4-1963(现称为 ANSI X3.4-1963“7 位美国国家信息交换标准代码”)。最新版本是 ANSI X3.4-1986。

由于这些系统无法代表所有 96 个图形代码点,因此省略了许多。此外,X3.4 与其他国家标准机构(GBR、GER、ITA 等)协调,X3.4 中的代码点被指定为国家替换字符——最明显的例子是英镑的#符号(很明显,因为 # 字符的名称是“井号”,因为它在美国商业中的传统用法 - 在 Twitter 的演变之前)和 '{' '}' 也被指定为国家替换字符。

因此,有向图被引入为那些无法表示字符的计算机系统提供一种机制,也为将国家替换字符分配给冲突代码点的数据终端设备提供了一种机制。Di/Tri-graph 已成为计算历史的古老产物(如今计算机科学中没有教授的主题)。

关于这个主题的详尽论文可以在这里找到:http ://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.96.678&rep=rep1&type=pdf

于 2016-11-11T14:28:48.210 回答