为什么将插入号用于XOR而不是求幂?


32

对于以前曾经遇到过此语法问题的任何人来说,这并不是一个真正的问题,但是我看到使用插入号(^)作为XOR运算代替了广泛接受的数学幂运算而引起的大量混乱。

当然,在很多地方都可以解释和纠正插入符号的(误用)用法,但是对于插入符号为何具有不同的含义,我没有找到任何明确的资料。

是为了方便吗?一次意外?显然,各种语言的推理可能会有所不同,因此任何方面的信息都将很有见地。


Answers:


58

虽然有年龄较大的前体,具有影响力的法国数学家笛卡尔通常为引入上标指数(一b)为数学写作,在他的作品几何学这是发表在1637年这仍然是普遍在数学今天使用的符号。

Fortran是最广泛用于数值计算的最古老的编程语言,提供了幂运算符,其历史可以追溯到1954年。幂运算用双星号表示**。应该注意的是,当时许多计算机使用的6位字符编码不提供脱字符号^。随后使用的**是各种提供幂运算的较新编程语言的创建者,例如Python。

包含插入符号的第一个被广泛采用的字符集是1963年首次标准化^的7位ASCII编码。据我所知,最早使用编程符号表示指数的编程语言是BASIC,该语言可追溯到1964年。 IBM当时采用EBCDIC字符编码,其中还包括插入符号^

C语言于1972年问世。它不提供幂运算符,而是通过诸如的库函数支持幂运算pow()。因此,在C语言以及后来的C系列其他语言(例如C ++和CUDA)中,不需要为符号取舍而留出任何符号。

另一方面,对于当时的编程语言,这并不常见,C提供了按位运算的符号。7位ASCII中可用的特殊字符数量受到限制,并且由于其他操作与某些特殊字符之间存在“自然亲和力”,例如&AND和~NOT,因此XOR符号没有太多选择。

我不知道Ritchie或Kernighan提供的公开理由,说明他们为什么选择^专门表示XOR。里奇(Ritchie)的C历史对此问题无语。一看规范的前身C,对B语言,表明它没有一个XOR运算符,但已经使用的所有特殊字符以外^$@#

[更新]我向B的创建者兼C的共同创建者之一Ken Thompson发送了电子邮件,询问选择^C的XOR运算符的理由,并请求在此处分享答案。他的答复(为便于阅读而略微重新格式化):

发件人:肯·汤普森(Ken Thompson)
发送:2016年9月29日,星期四4:50
收件人:诺伯特·乔法(Norbert Juffa)
主题:回复:在C语言中选择插入符号作为XOR运算符的理由是什么?

这是剩余字符的随机选择。

如果我要再做一次(我做了),我将对xor(^)和位补码(〜)使用相同的运算符。

由于^现在是众所周知的运算符,因此在go中,^是xor且也是补数。

^您所指的在“数学”中使用幂运算实际上是在较晚的日期用于排版系统(例如Knuth的TeX,其日期为1978),代数系统的命令行界面(例如,Mathematica的日期为1988)以及图形化的1990年代初期的计算器。

为什么这些产品采用对^进行幂运算?对于计算器,我怀疑BASIC的影响。在整个1980年代,它是一种非常流行的第一语言,并且还嵌入到其他软件产品中。因此,该符号对于许多计算器购买者来说是熟悉的。我的记忆模糊,但是我相信甚至有实际上运行简单的BASIC解释器的计算器。


4
那是一些不错的历史课。因此,真正的问题是“为什么Tex的软件(以及那个时期的其他产品)决定使用具有指数的XOR符号?” ;)
AxelH 2016年

5
@AxelH其实不是。TeX ^用于上标。对我来说,上标使用“上”字符,下标使用“下”字符(_)对我来说很有意义。
svick '16

2
@AxelH我同意svick的观点,即^建议使用向上箭头,这又暗示了上标指数的传统位置,因此有点自然。我确定Donald Knuth会回复一封电子邮件,询问他决定^在TeX中使用幂运算的决定,但是鉴于他正忙于处理更重要的事情,例如完成TAOCP,我不想采取这一步骤(我确实考虑过它)。
njuffa '16

7
根据en.wikipedia.org/wiki/Caret的说法,Algol 60使用向上的箭头进行求幂,并注意到最初ASCII在当前具有插入符号的同一代码点也具有向上的箭头,因此这两个显然大约在同一时间彼此相等。
佩里亚塔·布雷塔

4
确实是一个很好的历史答案。我只想添加一个可能的原因,让C实现位运算符而不是取幂:C的目标是成为一种低级语言,使程序员可以轻松访问CPU本身支持的大部分内容。CPU总是提供位操作指令,但我不知道有一个具有特殊求幂指令的CPU。因此,求幂总是需要一个循环(至少使用整数算术),并且C中没有一个功能可以将循环隐藏在语言构造之后。
cmaster
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.