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

2024-03-24 00:20:33 +08:00
 drymonfidelia
15393 次点击
所在节点    程序员
105 条回复
Inn0Vat10n
2024-03-24 13:23:19 +08:00
不是从 C 开始学的程序员,可能体会不到内存/pointer 操作时这个 1 ,0 差异带来的便利性
kkocdko
2024-03-24 13:44:26 +08:00
@BeautifulSoap 一楼就已经“回答到点上”了,似乎你也没注意看呢
cnbatch
2024-03-24 13:55:40 +08:00
@roundgis 啊哈,英式楼层编号方式,地面是第 0 层
BeautifulSoap
2024-03-24 14:02:25 +08:00
@kkocdko “偏移量”无法解释为什么从 0 开始的哦。因为在普通人朴素的认识里,第一个元素的偏移量那就是 1
fkdog
2024-03-24 14:05:04 +08:00
C 语言里数组变量指针指向的就是第一个元素的地址。
那取第一个元素就直接 a[0],取第一个元素就是 a[1]
laminux29
2024-03-24 14:11:51 +08:00
1.楼主说得对,这是计算机发展历史上的遗留问题,诸如此类问题,其实还有很多,比如,你去菜鸟驿站发邮件,发件方与收货方的地址,会写 1.2.3.4 和 5.6.7.8 嘛?

2.楼上很多学过的人,居然为这事强行洗。学习知识是为了用它、打破它,而不是被它固化与束缚。
snw
2024-03-24 14:17:06 +08:00
说到楼层的话,那可就不止 0 层/G 层了。。。

meislinsen
2024-03-24 14:25:54 +08:00
lua 语言才是真正反人类的语言,其他语言都是从 0 开始,就 lua 非要从 1 开始,从其他语言转过来就很适应,而且从 1 开始并没有什么特殊的理由,只是创始人的怪癖和标新立异,人为给 lua 语言和其他语言转换的困难。然后 lua 语言的表结构也很逆天,综合了字典和数组的功能,但是#只能取数组的长度,要取字典的还得自己实现,
adoal
2024-03-24 14:47:14 +08:00
@BeautifulSoap offset 是相对于 base 而言的。0 表示距离 base 为 0 ,1 表示距离 base 为 1……如果 head 元素偏移量是 1 ,那 base 是谁?在 head 之前强行引入一个 pre-head 作为 base ?
普通人意识里的从 1 开始,不是 offset ,而是 ordinal
adoal
2024-03-24 14:49:58 +08:00
如果你执着于把最开始的元素称为“第一个”,那就会在这事上纠结死。称为“头部”即可不在乎人类的序号规则,平心静气接受用元素距离头部的偏移量作为索引。
adoal
2024-03-24 15:00:05 +08:00
另外我想说的是,如果用下标从 0 开始的语言你容易写出 bug 来,换成下标从 1 开始的语言你一定还是会写出同样的 bug 。
locoz
2024-03-24 15:01:41 +08:00
@drymonfidelia #15 抢购脚本行数多不是很正常吗...如果是直接控制浏览器做的,光获取元素的都会有一堆内容,但那都是操作逻辑,跟编程语言的底层逻辑关系又不大,拿这个举例不太合适。
rahuahua
2024-03-24 15:08:23 +08:00
@BeautifulSoap 你说的这么多和一楼说的有什么区别,这不是学过编程的都知道么
nickxudotme
2024-03-24 15:35:58 +08:00
唔除了 Lua ,MATLAB 也是从 1 开始的(((
BeautifulSoap
2024-03-24 15:44:30 +08:00
@adoal 不需要你来给我解释,问一下身边没学过编程的人,他们下意识会认为偏移应该从 0 开始还是 1 开始


@rahuahua @adoal
“这不是学过编程的都知道的吗”
典型的知识的诅咒一般的言论。lz 写了这么多年代码依旧无法理解为什么数组从 0 开始,你真觉得我不把最底层内存地址的计算方法给说给 lz 听,他真能理解所谓的偏移量是什么东西吗
inertia
2024-03-24 15:48:29 +08:00
Julia 也是从 1 开始的,Fortran 、Mathematica 和 MATLAB 也一样。科学计算语言应该大部分都是从 1 开始的。
adoal
2024-03-24 16:00:44 +08:00
@BeautifulSoap 不不不,他们认为的“事”跟“偏移量”根本无关。你说的““偏移量”无法解释为什么从 0 开始的哦”,首先真的是要来谈偏移量,在编程这个语境里,然后再谈认知从 0 还是从 1 开始的合理性。而真正的普通人,他们说的只是“数(上声)数(去声)时的编号从 1 开始”,他们甚至脑子里嘴里都没有出现偏移量这个概念,你问他(编程,或者非编程时排列在一起的同质物品中的)一个元素相对于首位的偏移量是从 0 还是 1 算,他第一反应你说的是什么鬼东西。

另外我还想说的是,如果写了多年代码,并且从 0 和从 1 开始的语言都正式使用过,那不论是认为 0“更”合理还是 1“更”合理都没问题,但这里的出发点是“更”,也就是说至少对两种方式的优缺点都有所体会,对各自的合理性都能认识到,然后再这个基础上再谈自己的倾向性。而不是依旧无法理解其中一种方式的合理性,只认为另一种合理。多年下来还理解不了的,恕我暴论,还是别做程序员了吧。
zhady009
2024-03-24 16:11:20 +08:00
入乡随俗怎么样我都行(
raptor
2024-03-24 16:18:59 +08:00
看来你没用过 Pascal 。

想当年我一手 C 一手 Pascal ,一点问题都没有
iyaozhen
2024-03-24 16:47:54 +08:00
很反人类的设计 或许吧

很容易写出 bug ,这不认同。没见过这种 bug

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

https://ex.noerr.eu.org/t/1026418

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

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

© 2021 V2EX