使用方括号作为数组元素的习惯是如何发展的?


11

许多编程语言都使用该语法a[i]来引用i数组,序列或向量的'th元素a-特别是C和Pascal(从1960年代末至1970年代初)。另一方面,某些较早的语言(例如Fortran(1950年代))不使用此约定。另外,我学习了一些数学,数学家使用方括号作为间隔,下标用于数组和矩阵的下标(如果将数组视为非负整数的函数,则使用正则括号)。

因此,我的问题是:用于数组下标的方括号在哪里/如何/在什么情况下发展?由谁开发?

注意:这个问题完全不是关于在C中使用大括号的问题。



@gnat:这是个骗子吗?
einpoklum

1
相关但不是欺骗。
blaster

1
那里的第二个最高答案是方括号的历史
-Mar

1
@Paul Typo。你的意思是xkcd.com/163(该xkdc域在中国注册)
1201ProgramAlarm

Answers:


10

C和Pascal的主要前身语言是Algol。最早的版本是Algol 58,它使用方括号表示数组的声明和引用。

Algol使用方括号而不是括号的原因是三个方面:

  1. 因为他们可以。Fortran设计的早期IBM键盘只有括号。在指定Algol时,这种情况已经改变。
  2. Fortran的经验表明,程序员经常对过度使用括号感到困惑,因此这被视为重要的语法更改。
  3. Algol的目的是将其用于描述算法,因此使其更接近于标准数学符号是有意义的。

请注意,与C主要使用数组来索引内存的C语言不同,Algol允许同时指定上下索引范围。再次,这符合其更多的数学意图。事实上,Algol多年来一直是伪代码的事实语言。


但是方括号真的更接近标准数学符号吗?当我研究match时,它[x]被用于等价类,而不是向量或矩阵中的指示位置。
einpoklum

2
@einpoklum声明中的范围比引用中的下标或上标更多。但是,由于他们实际上无法使用当时的技术来制作下标或上标,因此他们寻求视觉上的一致性。而且他们并没有像APL那样以数学概念为目标。他们的目的是清楚地表达算法,这是一个相当狭窄的分支。
亚历克斯(Alex)

哦,同样,方括号用于间隔。从某种意义上讲,我想那就像数组中的范围。另外-您确定Algol是此习惯的起点吗?
einpoklum

@einpoklum我确定C和Pascal中使用方括号来自Algol。沿袭有据可查。如果Algol 58的前身是设计师采用的语法,则我没有意识到。考虑到时间,这不太可能,但并非没有。Algol 58在Algol 60之前没有实现,因此未实现的语言很有可能会受到启发。
亚历克斯(Alex)

5

这是一本有趣的文章:https : //en.m.wikipedia.org/wiki/Bracket

以下是我自己的观察。

C设计师非常小心地采用了字符和构造的含义,因为它们已经在常规书面语言中使用了数百年。这样做,他们必须使用相当有限的ASCII字符子集。在西方语言中,书面文本中使用了更多的分组字符,但这些字符并未将其转换为ASCII。

在常规语言中,括号的含义是在不中断主要消息的情况下提供辅助信息。这在调用过程时很有意义:主要消息是要执行的操作,子信息是参数。

花括号用于分组。“这些词集合在一起,应与其余词区分开”。因此,将它们用于代码块,复合语句很有意义。

方括号用于插入不属于原始文本的文本,以阐明原始文本并提供上下文。或用省略号表示省略:[...]。“她(女王)没有被逗乐”。在计算机编程中,将括号用于数组索引有点意义,因为它是提供的一种上下文。“数组?什么数组?嗯,特别是那个元素。” 但是,即使原始含义不能完全涵盖计算机语言中的使用,也没有太多其他ASCII选项可供选择。

因此,我想说这是现有技术与当时可用的组合,导致使用方括号进行数组索引。

[由于亚历克斯的评论而编辑]

根据消息来源,ASCII于1963年引入,并于1968年获得政府批准。根据此Wiki的说法,C语言的开发直到1969年才开始。因此,Ritchie先生在选择字符时似乎一直在关注这一被广泛支持的新标准ASCII。

另请参阅其他答案,以证明Algol是“多种语言之母”的强大影响力。


我想我明白您的意思,但是直到C语言设计将近十年之后,ASCII才被编纂。更为直接的影响是C设计的PDP-11键盘。使用它支持的字符很有意义。Algol通过BCPL和B直接启发了将方括号用于数组。Pascal同样如此。Wirth在设计Pascal之前实施了Algol-W。
亚历克斯(Alex)
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.