这个问题,Dijkstra大神在1982年就写过论文了,题为 Why numbering should start at zero
总共也就3页手写,我就摘重点的大致翻译一下:
为了表示一个自然数序列2, 3, …, 12,排除掉中间的那三个点(...),总共有四种方式可供我们选择:
a) 2 <= i < 13
b) 1 < i <= 12
c) 2 <= i <= 12
d) 1 < i < 13
有没有什么原因使得我们应该选其中的某一种而不是其他的呢?是的,的确有。观察到 a) 和 b) 的优势是不等式的上下界之差恰好是序列的长度。基于此,作为一个中间结论:在 a) 和 b) 两种表达中中,两个序列是邻接的就意味着一个的上界等于另外一个的下界。但这些考量并没有让我们从 a) 和 b) 之中做出选择,所以我们从头开始。
存在一个最小的自然数。排除掉下界——就像 b) 和 d) 中那样——就会使得一个从最小的自然数开始的序列的下界变成非自然数。这样的表达方式很难看,所以对于下界应该更倾向于<=,就像 a) 和 c) 那样。现在,考虑一下从最小的自然数开始的序列:假如包含上界,当序列缩小成空序列时,就会使得 c) 不那么像自然数集。这样的表达方式也很难看,所以对于上界应该更倾向于<,就像 a) 和 d) 那样。综上所述, 我们应该倾向于使用 a) 的表达方式。
当处理长度为N的序列时,我们期望通过下标来区分它的元素。下一个恼人的问题就是,我们该给它的第一个元素赋予什么下标值?使用 a) 的表达方式,当下标从1开始时,下标范围为 1 <= i < N+1;当下标从0开始时则是 0 <= i < N,更好看。所以,让我们将序号从0开始:一个元素的序号(下标)等于序列中在它前面的元素个数。这个故事的寓意是我们更应该——过了这么多个世纪!——把0当作一个自然数。
来自知乎:为什么有些编程语言的数组要从零开始算?