为什么C和C++中有有关图?

Syd*_*ius 71 c c++ c99 digraphs

我今天学到了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:>;
    %>
%>
Run Code Online (Sandbox Code Playgroud)

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

CTT*_*CTT 61

为没有支持ISO 646字符集的键盘的程序员创建了有向图.

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

  • 我最近发现了[这篇文章](http://wiert.me/2012/07/04/hollerith-and-why-we-have-digraphs-in-pascal-and-trigraphs-in-cc-nostalgia-apple- plus/),它指出 Pascal 中的有向图的根源不是键盘限制,而是穿孔卡字符表示限制。是的,Pascal 不是 C 或 C++,但我想你可能会觉得它很有趣。 (3认同)
  • 非 ASCII 键盘不是问题。当然,它看起来很奇怪,但是... main(int argc,char *argväÅ) ä printf("HelloÖn"); A (2认同)

Gre*_*ill 24

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

此外,它在IOCCC中提供了良好的条目.

  • 不一定是编译器,Greg.一些大型机EBCDIC字符集的方括号没有一致的字符,这相当于填充了数组处理.与编译器本身相比,这是编辑器和/或终端仿真器的限制. (5认同)
  • 提及[IOCCC](http://www.ioccc.org/)为我的答案增添了重要的价值. (5认同)
  • ++ forioccchumour! (3认同)

Chr*_*isW 12

我认为这是因为这个星球上的一些键盘可能没有'#'和'{'等键.


小智 6

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中的代码点被指定为国家替代字符 - 最明显的例子是Britsh Pound的#符号(显而易见,因为#字符的名称是"英镑符号",因为它是美国商业中的常规用法 - 在Twitter发展之前),而'{''}也被指定为国家替代字符.因此,引入有向图以便为那些不能表示字符的计算机系统提供机制,并且还为数据终端设备提供机制,该数据终端设备将国家替换字符分配给冲突的代码点.Di/Tri-graphs已经成为计算历史的一个古老的工件(这些天没有在计算机科学中教授过) - 关于这个主题的详尽论文可以在这里找到:http://citeseerx.ist.psu.edu/viewdoc/下载?DOI = 10.1.1.96.678&代表= REP1&类型= PDF