为什么大多数编程语言的索引都从零开始?
今天早上我在日历上数着距离约会还有多少天。“0、1、2、3……”我小声嘟囔着。幸好我把它说了出来,不然就发现自己错了。这就是花几个小时做基于数组的 JavaScript 题目的后果!
这让我忍俊不禁,但也让我好奇为什么大多数编程语言都要从零开始计数。我以前知道,但后来完全忘了。所以,跟我一起学习一些计算机科学知识吧。
首先,我们需要澄清一点——我们实际上并不是从零开始计数,而是从零开始建立索引。Stack Exchange 上 mowwwalker 的这条评论让我受益匪浅:
“等等,等等,没人从零开始数,我们从零开始索引。没人说“第零个”元素。我们说索引为 0 的“第一个”元素。你可以把索引理解为元素相对于第一个位置的偏移量。第一个元素就在第一个位置,所以它没有偏移,因此它的索引是 0。第二个元素在它前面一个元素,所以它偏移了一个元素,索引是 1。——mowwwalker 2013年4月5日 14:32”
我发现这条评论有助于我调整视角,但这并非我们从零开始计数的原因。答案在于像迪杰斯特拉这样有影响力的计算机科学家所采用的方法。
埃兹格·W·迪科斯特拉对计算机科学做出了卓越的贡献,包括算法、新概念、方法、理论和研究领域。他也是“从零开始”理念的倡导者。
1982 年 8 月,他写了一篇关于这个主题的短文。他首先研究了表示自然数的四种不同方法2, 3, ..., 12。
在他的论文中,Dijkstra 排除了 c) 和 d),因为它们缺乏 a) 和 b) 的优势。也就是说,在 a) 和 b) 中,子序列的长度等于边界之间的差值(在这些情况下,是 11),如果你有两个相邻的子序列,一个子序列的上界将等于另一个子序列的下界。
例如,在相邻子序列中1 < i ≤ 13,13 < i ≤ 23第一个子序列的上界等于第二个子序列的下界(13)。
好的,但是 a) 和 b) 哪个更好呢?Djikstra 指出 b) 的表示法中省略了下界。这很不方便,因为如果你从 0 开始一个子序列,比如 0,1,2,那么你就会强制使用非自然数来表示,就像这样:-1 < i ...
正如迪杰斯特拉所说,这很“糟糕”,所以我们选择第一种方法。
如果我们采用第一种方法,那么我们如何用下标来表示元素呢?或者,正如 mowwwalker 所说,如何表示每个元素相对于第一个位置的偏移量?Dijkstra 的答案很简单:
Dijkstra 的影响,以及我推测的其他计算机科学巨匠的影响,解释了为什么大多数编程语言都从零开始。
满足了好奇心后,在一个美好的周日早晨,我继续享用我的咖啡和姜饼。
文章来源:https://dev.to/cerchie/why-do-computers-count-from-zero-3mh6

