6

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

 1 month ago
source link: https://www.v2ex.com/t/1026418
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  程序员

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

  drymonfidelia · 4 小时 8 分钟前 · 601 次点击
21 条回复    2024-03-24 03:46:33 +08:00
wolfie

wolfie      4 小时 0 分钟前   ❤️ 1

使用另一个语言时候,就要做一定妥协。
0 代表 偏移量为 0 ,没什么问题啊。
Adelell

Adelell      3 小时 59 分钟前 via iPhone

碳基喜欢数数从一开始,硅基喜欢从零开始。
mohumohu

mohumohu      3 小时 58 分钟前

也有好处,比如你循环 100 次可以直接写小于 100
ipwx

ipwx      3 小时 53 分钟前

你可以申请 N+1 个大小,然后扔掉第 0 个。。。
drymonfidelia

drymonfidelia      3 小时 50 分钟前

@ipwx 那样解析 json 或者其它外部来源的数组的时候就会丢掉一个
ipwx

ipwx      3 小时 48 分钟前

都处理 JSON 的代码了,世界上大部分语言都是 0 开始的,或许你需要修正一下自己的习惯
kneo

kneo      3 小时 1 分钟前 via Android

为什么有的语言和别人都不一样,就没想过反思一下吗?
但凡写过一千行正经代码都不会说出这种标题。
yunye

yunye      3 小时 0 分钟前

你不喜欢就说你不喜欢,别轻易代表人类
stinkytofu

stinkytofu      2 小时 56 分钟前

我们日常生活中很多都是从 0 开始的。 比如最常用的时间,0 点就是一天的开始
drymonfidelia

drymonfidelia      2 小时 54 分钟前

@kneo 我写过几十万行了
nuistzhou

nuistzhou      2 小时 48 分钟前 via iPhone

哈哈,你再看看那些有 0 层的电梯
kneo

kneo      2 小时 46 分钟前 via Android   ❤️ 2

@drymonfidelia 我说的是正经代码。你这几十万怎么来的我不知道。但我不相信一个手动敲过千行代码,写过循环,用过数组,修过 bug ,认真思考总结过的人,能问出这种不正经的问题。
country

country      2 小时 45 分钟前

因为《爱从零开始》
drymonfidelia

drymonfidelia      2 小时 41 分钟前

@kneo 我随便写着玩的一个抢购脚本都不止千行
dobelee

dobelee      2 小时 39 分钟前 via Android

“容易出 bug”是怎么得出的?工作中从来没有因为 0 出过 bug ,也没有见过人因 0 出过 bug 。只有初学几天的由于习惯问题别扭。
BeautifulSoap

BeautifulSoap      2 小时 38 分钟前 via Android   ❤️ 4

楼上这么多人甚至都没人回答到点的,你们不会连 c 都没学过吧。。。

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

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

至于其他语言里“数组”可能并非真数组,可变长度的“数组”并非原始严格意义上的数组。但是为了保持一直以来的使用习惯,也采用了一模一样的下标用法
heiher

heiher      1 小时 45 分钟前 via Android

个人拙见应该只是为了简化内存系统地址计算与编程语言层面的数组索引的映射关系。比如有一个数组包含 2 个字节单位的元素,存放于内存中,内存起始地址是 A ,那么第 1 个字节的内存地址就是 A(+0),第二个是 A+1 ,即映射算法就是 A+index 。编程语言若将数组索引设计为从 0 开始能刚好匹配,而如果编程语言索引是设计从 1 开始的,那么数组访问转换到内存寻址算法则是 A+index-1 。人看着可能是自然了,但在当前主流的 CPU 指令系统上,变量 index 的场景要多一步-1 的运算吧。
cxumol

cxumol      1 小时 10 分钟前

错误的, R 语言也是从 1 开始数起
lesismal

lesismal      1 小时 3 分钟前

学代码之前数数可从来没从 0 开始过啊...
学代码之时觉得从 0 开始咋这么反人类...
学代码之后觉得从 1 开始咋这么反人类...
LeeReamond

LeeReamond      42 分钟前   ❤️ 1

@drymonfidelia 我从高中码到现在超过十年,仔细想了一下我个人实践的所有项目,恐怕加在一起也就二十万到三十万行之间,而且我自觉算是很勤奋的了。企业里正常程序员计算绩效,别管用什么语言,一天提交超过 200 行就算满状态工作了,算下来你十年不停,总共也就能开发 70 万行代码。

不知道你这几十万怎么出来的,几十万哥问出内存计数问题属实是让人见识物种多样性了。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK