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


76

我今天了解到,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:>;
    %>
%>

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


5
验证我的翻译?%:是#,<%%>是{},而<::>是[]。这个对吗?
abelenky

6
真正的答案:因为IBM大声疾呼,并坚持将其强加给所有人。

1
投票重新开放。这个问题比这个问题更具体(仅关于andor)。这是一种更有用的形式,具有更多的赞誉。编辑:应该是以下内容的副本:stackoverflow.com/questions/1234582/…而是。
西罗桑蒂利郝海东冠状病六四事件法轮功

1
真正的答案:因此,您可以编写混淆代码:-)
MD XF

Answers:


68

有向图是为不具有支持ISO 646字符集的键盘的程序员创建的。

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


2
我最近发现这篇文章,指出Pascal中的有向图的起源不是键盘限制,而是打孔卡字符表示形式的限制。是的,Pascal不是C或C ++,但我认为您可能会发现它很有趣。
qqbenq 2014年

1
非ASCII键盘不是问题。当然看起来很奇怪,但是... main(int argc,char *argvÄÅ)äprintf(“HelloÖn”); 埃
robinr

25

我认为它们的存在可以追溯到某处某人正在使用带有操作系统的编译器的可能性,该操作系统的字符集是如此陈旧,以致于它不一定具有C或C ++表示整个语言所需的所有字符。 。

同样,它也为IOCCC做好了准备。


6
不一定是编译器,Greg。某些大型机EBCDIC字符集在方括号中没有一致的字符,而是塞满了数组处理。这是编辑器和/或终端仿真器的限制,而不是编译器本身的限制。
paxdiablo

我并不是真的只是编译器。我编辑来澄清。
2009年

不,与EBCDIC没有关系。这些顺序是为了使斯堪的纳维亚人使用一些ASCII字符作为语言字符(因此,键帽和输出中的符号不​​同)。
Jim Balter

5
对我来说,提到国际奥委会,为这个答案增加了重要价值。
韦斯顿2014年

15

我认为这是因为地球上的某些键盘可能没有诸如“#”和“ {”之类的键。


10

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-graphs已成为计算历史的古老文物(如今,计算机科学尚未教授该学科)。

有关此主题的详尽论文,请访问以下网址http : //citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.96.678&rep=rep1&type=pdf

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.