从一,不……从零开始——为什么许多编程语言,从零开始计数?

如题,许多编程语言的数组,都是从零开始计数。比如 JavaScript 中写个简单的数组,并获取 index 为零的值:

const 水果 = ["香蕉", "苹果", "桃子"];
console.log(水果[0]);


则会返回 `"香蕉"`。这种设计的流行,往往会追溯到 C 语言。C 语言虽然算是高级语言,但为了性能,还是有许多低级语言的特点。而数组在 C 语言的描述中,其本质是指向内存地址,而数字表示偏移值。因此没有偏移的 0,表示第一个,即 0 = 1。

之后许多高级语言使用索引概念,来表示数组序号,但受到 C 语言的影响,同样沿用了「从零开始」。只有少量较边缘的语言,比如 Lua 和 MATLAB 使用了从 1 开始的数组序号,即 1 = 1。

所以,程序员不一定都习惯从零开始计数,只是因为历史惯性,不得不沿用这个有些反直觉的计数方法。但这又因为这仅仅是历史惯性,所以存在一些矛盾,比如代码行号。

大多数编辑器的默认设置,和语言的规范中,代码行号均是从 1 开始。比如 Python 的错误报告,只有在从 1 开始行号的编辑器上,才能找到对应的错误,即 1 = 1。

而游戏 Mindustry 里的编程语言 mlog,使用的是从零开始的行号,并具有实用性,因为在执行 jump(goto)指令时就需要指定准确的行号,即 0 = 1。

这种一会儿 0 = 1,1 = 1 混杂的情况,有些令人头大。于是有 VSCode 编辑器的使用者,想要让其支持从零开始行号的设置,而发起功能请求。但来自微软的开发者,以其他编辑器没有支持该功能为理由,关闭了此功能请求。说明历史惯性,对这些问题的影响很大……

灵感和部分内容来自哔哩哔哩 UP 主「原子能」的视频《那些无解的计算机问题【让编程再次伟大#16】》。

#考据 #杂谈
 
 
Back to Top