原文地址: 爲何數組下老是從 0 開始呢?數組
這個問題有沒有想過?會不會認爲爲什麼設計的如此反人類呢?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
好比方法 a 中,13 - 2 = 11,而範圍內恰好就有 11 個元素,方法也有一樣的性質,但方法 c 和 d 就沒有。io
兩個連續的範圍咱們但願能夠寫成 「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) * 數據大小
複製代碼
對 CPU 來講,每次隨機訪問,就多了一次減法運算,多發一條指令,因此從 0 開始能夠減小 CPU 的計算。
想了解不少,請關注下面: