为什么有些编程语言的数组要从零开始算
2014-07-17 10:19
183 查看
这个问题,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当作一个自然数。
来自知乎:为什么有些编程语言的数组要从零开始算?
总共也就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当作一个自然数。
来自知乎:为什么有些编程语言的数组要从零开始算?
相关文章推荐
- 为什么有些编程语言会死而有些能活下来?
- 为什么大多数编程语言中的数组都从0開始
- 为什么大多数编程语言中的数组都从0开始
- 为什么大多数编程语言中的数组都从0开始
- 为什么数组是从零开始?好处是。。。
- 为什么会有这么的编程语言
- 为什么有些大公司技术弱爆了?
- 为什么有些网站前面不加 WWW?
- 为什么有些程序在打开方式中不会显示 解决。
- 为什么有些程序员悄无声息渡过35岁中年危机?
- 为什么编程语言以及数据库要从1970年1月1日开始计算时
- thinkphp中 数组为什么在assign之后可以模板中直接读取数组的元素
- C语言 为什么数组名(数组首地址)不能进行加减操作?
- c语言 数组名&&结构体名 为什么不能用数组名给数组赋值,结构体却可以
- 01背包问题 总结关于为什么01背包优化成1维数组后,内层循环是逆序的?
- Java从零开始学十(Arrays类对数组的常用方法)
- 编程语言的学习 -----------python从零开始
- 为什么有些东西,反反复复总是学不会
- Java编程:浅析 HashMap 中数组的 size 为什么必须是 2 的整数次幂
- 【从零开始】用数组自定义缓存