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

45 天前
 drymonfidelia
8070 次点击
所在节点    程序员
105 条回复
wolfie
45 天前
使用另一个语言时候,就要做一定妥协。
0 代表 偏移量为 0 ,没什么问题啊。
Adelell
45 天前
碳基喜欢数数从一开始,硅基喜欢从零开始。
mohumohu
45 天前
也有好处,比如你循环 100 次可以直接写小于 100
ipwx
45 天前
你可以申请 N+1 个大小,然后扔掉第 0 个。。。
drymonfidelia
45 天前
@ipwx 那样解析 json 或者其它外部来源的数组的时候就会丢掉一个
ipwx
45 天前
都处理 JSON 的代码了,世界上大部分语言都是 0 开始的,或许你需要修正一下自己的习惯
kneo
45 天前
为什么有的语言和别人都不一样,就没想过反思一下吗?
但凡写过一千行正经代码都不会说出这种标题。
yunye
45 天前
你不喜欢就说你不喜欢,别轻易代表人类
stinkytofu
45 天前
我们日常生活中很多都是从 0 开始的。 比如最常用的时间,0 点就是一天的开始
drymonfidelia
45 天前
@kneo 我写过几十万行了
YsHaNg
45 天前
nuistzhou
45 天前
哈哈,你再看看那些有 0 层的电梯
kneo
45 天前
@drymonfidelia 我说的是正经代码。你这几十万怎么来的我不知道。但我不相信一个手动敲过千行代码,写过循环,用过数组,修过 bug ,认真思考总结过的人,能问出这种不正经的问题。
country
45 天前
因为《爱从零开始》
drymonfidelia
45 天前
@kneo 我随便写着玩的一个抢购脚本都不止千行
dobelee
45 天前
“容易出 bug”是怎么得出的?工作中从来没有因为 0 出过 bug ,也没有见过人因 0 出过 bug 。只有初学几天的由于习惯问题别扭。
BeautifulSoap
45 天前
楼上这么多人甚至都没人回答到点的,你们不会连 c 都没学过吧。。。

但凡学过 c 这类底层点的语言也不会问出这种问题。。。

因为数组本质上是一个指向一整块连续内存块的指针(即存储了一块内存的地址),访问数组元素本质上就是对指针做加法操作。
比如数组 a 指向的内存块地址是以 0x0001 为起点的一块连续内存,这样 0x0001 这个位置的数据就是第一个元素。要取第一个元素的话就直接获取 0x0001 + 0 处的元素,要获取第二个元素的话就是去获取 0x0001+4*1 这个地址下的数据(假设这个数组是存储了 32bit 共 4 自己长度的 int 元素的数组),获取第三个元素就是 0x0001+4*2 。就这么简单的理由,数组中下标指代的就是*1 *2 这里的数字,本质上就是一个“语法唐”

至于其他语言里“数组”可能并非真数组,可变长度的“数组”并非原始严格意义上的数组。但是为了保持一直以来的使用习惯,也采用了一模一样的下标用法
heiher
45 天前
个人拙见应该只是为了简化内存系统地址计算与编程语言层面的数组索引的映射关系。比如有一个数组包含 2 个字节单位的元素,存放于内存中,内存起始地址是 A ,那么第 1 个字节的内存地址就是 A(+0),第二个是 A+1 ,即映射算法就是 A+index 。编程语言若将数组索引设计为从 0 开始能刚好匹配,而如果编程语言索引是设计从 1 开始的,那么数组访问转换到内存寻址算法则是 A+index-1 。人看着可能是自然了,但在当前主流的 CPU 指令系统上,变量 index 的场景要多一步-1 的运算吧。
cxumol
45 天前
错误的, R 语言也是从 1 开始数起
lesismal
45 天前
学代码之前数数可从来没从 0 开始过啊...
学代码之时觉得从 0 开始咋这么反人类...
学代码之后觉得从 1 开始咋这么反人类...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1026418

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX