直接回答:核心原因是下标的本质是偏移量而非序号:a[i] 的地址 = 数组基址 + i × 元素大小。i 从 0 开始时,第一个元素的偏移量恰为 0,地址计算天然简洁,不需要多减一次 1。C 语言把数组名直接弱化为指针,a[i] 与 *(a+i) 等价,这一语义随后被 Java、Python、JavaScript 等绝大多数主流语言继承。
展开解析:除计算效率外还有设计层面的论证。Dijkstra 曾撰文指出:表示长度为 N 的自然数区间,左闭右开 [0, N) 的形式最优雅——上下界之差直接等于元素个数,空区间无需引入"零前面的自然数"这种别扭边界;从 0 开始的下标恰好与该约定吻合。历史上 C 继承自无类型的 BCPL/B,指针加偏移就是唯一寻址方式,0 基顺势而定。反例也存在:Fortran、MATLAB、Lua 从 1 开始,因为面向数学与工程用户,与数学记号一致更友好;Pascal/Ada 甚至允许任意下界。追问方向:0 基与左闭右开切片(a[lo:hi] 长度为 hi-lo)如何互相成就、1 基语言做指针运算的代价。