为什么“||”是或的符号?

23

我知道||代表逻辑运算符"或",但我很好奇有没有人知道选择那个符号的历史。是因为它恰好是键盘上未使用的符号吗?


4
大多数编程语言中,| 表示按位或而不是逻辑或。 - Grijesh Chauhan
我认为逻辑运算符 || 的出现是由于按位或运算符 |。 - Grijesh Chauhan
1
SQL 中,它是字符串连接运算符。 - user330315
需要注意的是,在ASCII和EBCDIC中,|字符所占用的代码位置通常会有所不同。常见的是一个分割的竖线,我还记得一些其他类似“波浪线”的字符。但实际上没有其他字符可用,除非你选择APL路线。 - Hot Licks
5
如果只有更多像这个所谓的“离题”问题一样具有价值和趣味性的“主题相关”问题! - hippietrail
显示剩余5条评论
6个回答

43

单竖线“|”作为表示分离“或”的起源

来自ASCII字符历史

有猜测认为,竖线字符是通过Backus-Naur形式元语言引入到计算领域的。它也在20世纪60年代早期被引入APL中,并在同一时间内并入了PL/I作为OR运算符和重复运算符。

约翰·沃纳·巴克斯(1924年12月3日 - 2007年3月17日)是一位美国计算机科学家。他领导了发明第一个广泛使用的高级编程语言(FORTRAN)的团队,并发明了Backus-Naur形式(BNF),这是几乎普遍用于定义形式化语言语法的符号。他还研究了函数级编程,并帮助推广了它。

他是IBM的一名编程语言设计师,提出了“元语言公式”来描述新编程语言IAL的语法,该语言今天被称为ALGOL 58,并使用BNF符号。

在巴科斯-诺尔范式中,表达式由符号和/或序列组成,用 '|' 分隔开,表示选择,整个表达式可以替换左侧的符号。

<personal-name> ::= <name> | <initial>

在ALGOL 58规范中,Backus最初没有使用竖线;他使用了带有一条线的单词“or”(以及逻辑符号OR symbol)。丹麦计算机科学家Peter Naur为ALGOL 60做出了贡献,修改了几个符号,使它们可以在标准键盘上输入。其中一个变化是添加了竖线。(来源:“Programming Languages History”,Richard L. Wexelblat)

即使在ALGOL 60规范之后,仍有许多例子显示使用OR symbol符号与ALGOL一起使用。事实上,1961年ASCII字符集添加了反斜杠以便使用斜杠键输入ALGOL的逻辑运算符,例如:\/ /\ 这些符号可以在IBM 2741键盘上找到,该键盘于六十年代中期推出。

IBM Keyboard

但是有明确的证据表明,Naur在ALGOL 60中添加了竖线。在1964年发表的一篇文章中(Knuth D.,“Backus Normal Form vs. Backus Naur Form” Letters to the Editor, Communications of the ACM, Vol. 7 (1964). pp. 735-736, 可以在这里找到),Donald Knuth认为应该将“Backus Normal Form”称为“Backus Naur Form”,因为Naur做出了贡献。他提到的贡献之一是添加竖线作为或运算符。

以下是1964年文章的部分图像。请注意右侧的项目(iv)。

enter image description here

这篇文章继续描述纳乌尔在编辑1960年Algol报告时,作为他的编辑职责之一,对该语义变化负有责任。

enter image description here

双竖线“||”的起源

C语言的发展中,Dennis M. Ritchie描述了为什么添加了双竖线运算符:

在确定语言名称之后,快速变化仍在继续,例如引入了&&和||操作符。在BCPL和B中,表达式的求值取决于上下文:在if和其他将表达式的值与零进行比较的条件语句中,这些语言对and(&)和or(|)操作符进行特殊解释。在普通上下文中,它们按位操作,但在B语句中,
if (e1 & e2) ...
编译器必须评估e1,如果它是非零的,则评估e2,并且如果它也是非零的,则详细说明依赖于if的语句。该要求在e1和e2内部的&和|运算符上递归下降。在这种“真值”上下文中,布尔运算符的短路语义似乎是可取的,但是操作符的重载很难解释和使用。根据Alan Snyder的建议,我引入了&&和||运算符,使机制更加明确
(感谢Richard Brown为本节研究做出的贡献)。

@eznme更新了答案。显然,竖线是随着ALGOL 60而来的,而不是ALGOL 58。 - Cameron Fredman
你从哪里得到 A60 有 | 运算符的信息?我甚至在 68 中都找不到它们。 - Bernd Elkemann
如果Algol 58、60、68中有|或运算符,那么应该有一些公开的信息。 - Bernd Elkemann
事实上,我确信所有Algol语言都只使用单词“or”而不是逻辑或运算符。 - Bernd Elkemann
3
看起来,Naur 在 1958 年至 1960 年间修订了 Backus 的符号,当时他正在起草 ALGOL 60 语法描述,并用带有水平线的竖杠 | 替换了单词“or”。这是 Algol 60 语法的链接。http://www.csci.csusb.edu/dick/samples/algol60.syntax.html#logical_operator ALGOL 60 语言中的逻辑 OR 运算符是单词“or”,但在用于指定 ALGOL 60 的元语言中使用了竖杠,从那时起,它似乎已经在其他语言中得到了应用。 - Richard Schwartz
显示剩余6条评论

3
我相信是 BCPL (wp) 首先引入了它。它的前身 CPL 有符号 |,但将其用作替代的行尾注释。
我没有发现任何关于这个原因的书面证据,但我们可以思考一下是否这是唯一的选择(这会成为一个很好的理由):
他们没有选择“or”这个词,因为上下文无关语法 (wp) 的概念在语言设计中变得非常流行,所以他们选择了一个不能成为有效符号的东西(符号被定义为 [a-zA-Z_]+[a-zA-Z0-9_]* 或者附加有 '-'通常)。
因此,他们查看了之前定义的标准中定义的所有字符。(请记住,该字符必须已经存在于某个标准中,因此他们不能只是决定并画自己的字符。)他们特别关注了三年前的 ASCII,但也关注了 EBCDIC。他们发现可供选择的内容不多:
除了字母表、下划线、数字和空格外,还有以下内容:NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US,这些都用作终端控制字符(不可打印)。 "" () {} [] 不符合语义,& 也一样(已被用作“and”超过100年)。 在ALGOL和/或CPL中使用了以下所有内容:! # $ % ' * + , - . / : ; < = > ? @ \ ^ _ ~。 因此,剩下的是 ` 和 |,但不能使用反引号,因为即使在声称符合ASCII标准的地方,它也不是普遍可用的。

1
我认为 BNF(1950年代)的答案在时间上领先于 BCPL(1966年)的答案。 - Cameron Fredman
我在1972年至1975年间使用BCPL进行编写,我相当确定(但依靠记忆)我所用的编译器将逻辑或运算符表示为\/ - Michael Kay

2

来源:http://cm.bell-labs.com/cm/cs/who/dmr/chist.html

在为语言命名后,快速的变化仍在持续,例如引入了 && 和 || 运算符。在 BCPL 和 B 中,表达式的求值取决于上下文:在 if 等条件语句中,它们会将 and (&) 和 or (|) 运算符进行特殊的解释来与零比较表达式的值。在普通上下文中,它们按位操作。而在 B 语句

if (e1 & e2) ... 编译器必须先评估 e1,如果它不为零,则评估 e2,如果 e2 也是非零值,则处理依赖于 if 语句的语句。对于 e1 和 e2 中的 & 和 | 运算符,要递归地满足该要求。在此类“真值”上下文中,布尔运算符的短路语义似乎很理想,但运算符的重载难以解释和使用。 在 Alan Snyder 的建议下,我引入了 && 和 || 运算符,使机制更加明确。


1
隐含的后续问题是:为什么使用 | 表示“或”中的第一个? - deceze
这可能是一个问题,需要向BCPL历史学家请教。祝你好运找到他们。 :) - Richard Brown

1

通过一番谷歌搜索,我找到的最早将 | 用作“或”的用法是在巴克斯-诺尔范式(Backus Naur Form)中。

该范式最初出现在J.W. Backus于1959年发表的苏黎世ACM-GRAMM会议上拟议的国际代数语言的语法和语义一文中,但他没有在那里使用 | 符号。相反,他使用了一个上划线的“或”符号。

然后在1960年,他写了关于算法语言ALGOL 60的报告,其中已经使用了 |-符号。

因此,他是在1959年至1960年之间发明了这个符号。


BNF的原始符号使用数学或符号“v”:https://home.comcast.net/~jhorning4/backus-proposed-ial.pdf - Bernd Elkemann

0

使用竖线表示“或”操作(逻辑运算符为||,位运算符为|)可能源自BNF。 BNF不是一种编程语言,但它在20世纪50年代末期开发出来,作为一种创建编程语言语法正式规范的方法。 BNF中的竖线字符表示非终端符号的有效扩展之间的选择。很有可能60年代及以后的编程语言设计师熟悉这种符号,并受其影响。


BNF的原始符号使用数学或符号“v”:https://home.comcast.net/~jhorning4/backus-proposed-ial.pdf - Bernd Elkemann
1
有趣。我不知道那个。谢谢。 - Richard Schwartz

-3

逻辑 OR || 符号实际上是从 + 加号符号分裂而来的。水平线条被旋转了 90 度,因此诞生了逻辑 OR || 符号。你可能会发现这在互联网上没有记录,因为它发生得太久远了。对于位运算 OR |,(你猜对了)十字架被从 + 加号符号中移除了。


1
或者 or+ 相等的理由是什么? - deceze
3
这听起来有点假传。让我猜下一个:“对于字母A,两个垂直的柱子向彼此倾斜。为了结构支撑加入了一根横杠。” - Cameron Fredman
1
给那些踩楼的人 - 放轻松 - 这不是一个严肃的更新。正如您可以从管理员关闭和CameronFredman的评论中看到,这种问题不应该在SE上发布。 - Java42
@CameronFredman +1 因为你很警觉... - Java42
@deceze:这个很简单。如果你使用0表示假,任何非0的数字表示真,那么你得到的真值表是“0+0=0”、“0+1=1”、“1+0=1”、“1+1=2”,……,所以+不仅仅是“或”的符号,而且实际上描述了操作的含义。同样,“00=0”、“01=0”、“10=0”、“11=1”,因此*是“与”的自然符号。 - BeniBela

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