无论是汇编还是高级语言中的内存,比如数组角标记,为什么都是从0开始而不是1?是历史遗留问题还是什么?
0或1的问题涉及很多因素。
并非所有语言都基于0。
在大多数开发环境中,集合对象的元素基于1。
一些非强制编程语言的数组也是基于1的。
以0为基的好处是基址偏移量的计算要简单得多。比如连续存储的N个4字节数据,只要知道第一个数据的起始位置为X,那么要取出第M个数据,只需从x+m*4(第一个是x+0*4=x)中读取4个字节即可。
假设是基于1,你需要这样计算:x+(m-1)*4,多一个减法计算。
基于1的优势是符合自然语言的习惯,更容易让人读懂。例如,当我们通过索引遍历一个集合时,我们通常写:
为了什么?指数?=?1?去哪?科尔普人。如果集合基于0,那么它应该写成。
为了什么?指数?=?0?去哪?科尔普人。数数?-?1这个显然没有前者好读。
一般来说,对于固定元素长度的结构,会采用基于0的设计,有助于减少遍历时定位的计算量,比如数组,提高执行速度。对于固定元素长度的结构,将使用基于1的设计,如set。