为什么除了 lua,数组索引基本都从 0 开始?很反人类的设计,很容易写出 bug

查看 212|回复 17
drymonfidelia
OP
  
@drymonfidelia 那有没有见过不止 lua https://www.aplwiki.com/wiki/Index_origin
YsHaNg   
哈哈,你再看看那些有 0 层的电梯
nuistzhou   
@drymonfidelia 我说的是正经代码。你这几十万怎么来的我不知道。但我不相信一个手动敲过千行代码,写过循环,用过数组,修过 bug ,认真思考总结过的人,能问出这种不正经的问题。
kneo   
因为《爱从零开始》
country   
@kneo 我随便写着玩的一个抢购脚本都不止千行
drymonfidelia
OP
  
“容易出 bug”是怎么得出的?工作中从来没有因为 0 出过 bug ,也没有见过人因 0 出过 bug 。只有初学几天的由于习惯问题别扭。
dobelee   
楼上这么多人甚至都没人回答到点的,你们不会连 c 都没学过吧。。。
但凡学过 c 这类底层点的语言也不会问出这种问题。。。
因为数组本质上是一个指向一整块连续内存块的指针(即存储了一块内存的地址),访问数组元素本质上就是对指针做加法操作。
比如数组 a 指向的内存块地址是以 0x0001 为起点的一块连续内存,这样 0x0001 这个位置的数据就是第一个元素。要取第一个元素的话就直接获取 0x0001 + 0 处的元素,要获取第二个元素的话就是去获取 0x0001+4*1 这个地址下的数据(假设这个数组是存储了 32bit 共 4 自己长度的 int 元素的数组),获取第三个元素就是 0x0001+4*2 。就这么简单的理由,数组中下标指代的就是*1 *2 这里的数字,本质上就是一个“语法唐”
至于其他语言里“数组”可能并非真数组,可变长度的“数组”并非原始严格意义上的数组。但是为了保持一直以来的使用习惯,也采用了一模一样的下标用法
BeautifulSoap   
个人拙见应该只是为了简化内存系统地址计算与编程语言层面的数组索引的映射关系。比如有一个数组包含 2 个字节单位的元素,存放于内存中,内存起始地址是 A ,那么第 1 个字节的内存地址就是 A(+0),第二个是 A+1 ,即映射算法就是 A+index 。编程语言若将数组索引设计为从 0 开始能刚好匹配,而如果编程语言索引是设计从 1 开始的,那么数组访问转换到内存寻址算法则是 A+index-1 。人看着可能是自然了,但在当前主流的 CPU 指令系统上,变量 index 的场景要多一步-1 的运算吧。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部