文章目录前言哪些语言索引从1开始为什么主流索引从0开始历史渊源硬件效率数学优雅后言前言相信不少编程初学者初学数组时都会疑惑为什么数组索引默认从 0 开始而非日常习惯的 1这样设计背后有着多重考量接下来就为你介绍这一美妙的性质。哪些语言索引从1开始大部分的编程语言第一个索引都是0比如 C/C、Java、Python、JS、Go 等但还有些语言索引却是从1开始比如 MATLAB、R语言、Lua、Fortran、Julia等。这些语言通常面向数学、统计和科学计算等特定领域它们的设计哲学优先贴合人类直觉和数学公式的习惯。这些语言运行时会自动把 1 索引转换成底层的 0 地址计算。在现代编译优化技术下这一转换的性能开销通常可以忽略不计。为什么主流索引从0开始历史渊源这个传统主要源于极具影响力的C语言。在C语言诞生约1972年时设计者们将数组在内存中的起始地址作为基准第一个元素的“偏移量”自然就是0。由于C语言在系统编程和操作系统领域的统治地位其设计范式被后来众多的流行语言如C、Java、JavaScript、Python、C#、Go、Rust、Swift等所继承。硬件效率索引其实是距数组头部的偏移量。arr[n]数组名对应的是第一个元素的地址而中括号表示的是从当前位置移动多少个元素。元素地址 基地址 索引 × 单个元素大小。访问元素本质是计算目标内存地址数组索引如果不从0开始就要计算偏移值。索引从 0 开始地址 基址 i * 大小一步到位无多余计算内存寻址最快索引从 1 开始地址 基址 (i - 1) * 大小每次都要多减 1浪费性能开销数学优雅计算机科学巨擘 Edsger Dijkstra 从数学上给出了论证其核心观点是0-based索引能让区间的表示更一致、更优雅。Dijkstra 认为描述一段连续整数唯一优雅的方式是起始 ≤ 索引 结束左闭右开。他表示序列 [2, 3, …, 12] 用区间 2 ≤ i 13 表示最自然。他证明了只有这种写法能同时满足 4 个完美特性区间上界与下界之差恰好等于元素个数13 - 2 11。如果是2 i 12左闭右闭和 1 i 13左开右开则边界的差不等于元素个数。对于从0开始的范围 0 ≤ i N空序列自然表示为 0 ≤ i 0空序列 没有元素。相邻区间无缝拼接2 ≤ i 5 和 5 ≤ i 7。索引不会出现负数。如果是左开右闭来表示[0,1,2,3,4]则范围是-1 i ≤ 4。-1 是非自然数而我们需要表示的连续序列是自然数序列所以这个不等式很不优雅。既然已经选择用起始 ≤ 索引 结束 这个不等式来表示长度为n的连续序列那起始元素应该选哪个数字在确定了“左闭右开”是最优区间表示法后对于一个长度为 N 的序列有两种起始选择从 1 开始1 ≤ i N1从 0 开始0 ≤ i N显然 0 ≤ i N 更优雅因为上界直接等于元素个数 N无需 1。同时从 0 开始意味着元素的下标天然等于它相对于首地址的偏移量序列中的第 0 个元素偏移量就是 0在逻辑和硬件上达成了完美统一。后言总结一下数组索引从 0 开始不是某个程序员的心血来潮而是历史惯性C语言、硬件效率免去一次减法和数学上的优雅Dijkstra 论证 三者交汇的结果。宝剑锋从磨砺出梅花香自苦寒来。有什么问题欢迎在评论区指出如果本篇博客对你有一丝帮助的话就给我点个小小的赞吧。๑乛v乛๑附赠 Dijkstra 手稿