为何数组下标老是从 0 开始呢?

原文地址: 为何数组下老是从 0 开始呢?数组

image

这个问题有没有想过?会不会认为为什么设计的如此反人类呢?bash

有两种比较好的说法,咱们了解下:spa

说法一

表示范围的最佳形式,好比表示天然数序列 2,3,···,12,有四种方法:设计

a. 2 ≤ i < 13 ,或者记做 [2, 13)code

b. 1 < i ≤ 12 ,或者记做 (1, 12]cdn

c. 2 ≤ i ≤ 12 ,或者记做 [2, 12]blog

d. 1 < i < 13 ,或者记做 (1, 13)get

a 方法是最好的,有以下缘由:it

  1. 范围的上限减去下限等于范围内元素的个数

好比方法 a 中,13 - 2 = 11,而范围内恰好就有 11 个元素,方法也有一样的性质,但方法 c 和 d 就没有。io

  1. 连续的范围没有重叠

两个连续的范围咱们但愿能够写成 “0 到 5” 和“5 到 9”这样的形式。若是使用方法 c,12 就同时包含在 [2, 12] 和 [12, 24] 这两个范围里;相似的,使用方法 d,13 既不包含在 (2, 13) 里也不在 (13, 25) 里。用方法 a,b 就没有这样的问题。好比 [2, 13) 和 [13, 25) 是两个连续的范围,13 只会包含在后一个里。

方法 a 比方法 b 好的理由:咱们经常会用到有下限无上限的集合,最典型的是天然数集合。好比要表示天然数集合内的范围 “0 到 10”, 用方法 a 能够写成 [0, 11) , 用方法 2 能够写成 (-1, 10] 。方法 b 的问题是形式中出现了 - 1 这个非天然数, 用非天然数来表示一个天然数集合内的范围显然不是一个好的选择。

说法二

咱们常说的数组下标最精确的意思是”偏移量 “,a[0] 的偏移量是 0,即为首地址。a[i]的偏移量是 i,寻址公式:

a[i]地址 = 首地址 + i * 数据大小

复制代码

若是下标从 1 开始,那对应的寻址公式

a[i]地址 = 首地址 + (i-1) * 数据大小

复制代码

image

对 CPU 来讲,每次随机访问,就多了一次减法运算,多发一条指令,因此从 0 开始能够减小 CPU 的计算。

想了解不少,请关注下面:

image
相关文章
相关标签/搜索