为什么C和C++中存在双字符?

84

我今天学到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:>;
    %>
%>
我的问题是:它们为什么存在?

6
确认一下我的翻译吧?%表示#,<% %>表示{},<: :>表示[]。这个翻译正确吗? - abelenky
11
真正的答案是:因为IBM声势浩大,坚持让每个人都采用该技术。 - user246672
2
投票重新开放。那个问题比这个更具体(只涉及“and”和“or”)。这个问题提出的形式更有用,而且赞数更多。编辑:应该是重复的:https://dev59.com/mnM_5IYBdhLWcg3ww2Ob。 - Ciro Santilli OurBigBook.com
3
真实的答案:所以你可以写混淆的代码 :-) - MD XF
5个回答

76

3
最近我发现了这篇文章,它指出Pascal中的双字符并不是由于键盘限制而产生的,而是源于打孔卡片字符表示限制。当然,Pascal并不同于C或C++,但我认为这可能会让你感到有趣。 - qqbenq
2
非 ASCII 键盘并不是问题。虽然看起来有点奇怪,但是...主函数(int argc, char *argv[]) { printf("你好\n"); } - robinr
@robinr,“看起来奇怪”正是斯堪的纳维亚人要求使用双字母组合的原因,而C标准委员会(我是其中的一员)对添加它们表示了抵制。 - Jim Balter
@Pryftan 这个问题是关于有向图,而不是三连符。至于“如果维基百科这样说”,你应该阅读维基百科文章以了解它到底在说什么,而不是猜测。(维基百科的文章没有错,但这个答案是错误的。) - Jim Balter
作为一个斯堪的纳维亚人,我刚刚转换成ASCII字符,并写了一些对我来说有趣但看起来有些奇怪的电子邮件。 - undefined

28

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

此外,这也是IOCCC中很好的参赛作品。


6
不一定是编译器,Greg。一些大型机EBCDIC字符集对于方括号没有一致的字符,这会使数组处理出现问题。这是编辑器和/或终端仿真器的限制,而不是编译器本身的限制。 - paxdiablo
我并不是说只有编译器的问题,我进行了编辑以澄清。 - Greg Hewgill
不,这与EBCDIC无关。这些序列是为了斯堪的纳维亚人而设计的,他们将一些ASCII字符用作语言字符(因此键帽上的符号和输出中的符号不同)。 - Jim Balter
5
提到IOCCC让我对这个答案的价值有了很大的提升。 - Weston
@Pryftan 这个问题是关于二元组而不是三元组的。我曾经参加过X3J11的讨论并直接参与其中。我的陈述是正确的。 - Jim Balter

17

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


16
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中指定了一些码点作为国家替代字符,其中最明显的例子是代表英镑符号的#(因其在美国商业中的惯用法中被称为“pound sign”,在Twitter进化之前已广为人知),以及‘{’ ‘}’也被指定为国家替代字符。
因此引入了双字母组合和三字母组合作为那些无法表示这些字符的计算机系统以及分配国家替代字符给冲突码点的数据终端设备的机制。然而,双字母组合和三字母组合已经成为计算机历史的过时遗物(这是如今不再教授计算机科学的一个题目)。
有关此主题的详尽论文可以在此找到:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.96.678&rep=rep1&type=pdf

1

根据维基百科上的文章,它们被创建为三连符的简单替代品。

也就是说,对于5个三连符??(??)??<??>??=,提供了替换的二元组:<::><%%>%:。这发生在1994年。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接