1. 程式人生 > 其它 >為什麼很多程式語言中的陣列都是從0開始編號?

為什麼很多程式語言中的陣列都是從0開始編號?

為什麼大多數程式語言中,陣列要從 0 開始編號,而不是從 1 開始呢?
從陣列儲存的記憶體模型上看: “下標”最確切的定義應該是“偏移(offset)”
a表示陣列的首地址,a[0]就是偏移為0的位置,也就是首地址,a[k]就表示偏移k個type size的位置,所以計算a[k]的記憶體地址只需要使用下面公式:

a[k]_address = base_address + k * type_size

但如果從1開始計數,那計算陣列元素a[k]的記憶體地址就變成了:

a[k]_address = base_address + (k-1)*type_size

不難發現,從1開始編號,每次隨機訪問陣列元素就會多了一次減法運算,對於CPU來說,就多了一次減法指令。

陣列作為非常基礎的資料結構,通過下標隨機訪問陣列元素又是其非常基礎的程式設計操作,效率的優化就要儘可能做到極致。所以為了減少一次減法操作,陣列選擇了從 0 開始編號,而不是從 1 開始。

歷史原因:C 語言設計者用 0 開始計數陣列下標,之後的 Java、JavaScript 等高階語言都效仿了 C 語言,或者說,為了在一定程度上減少 C 語言程式設計師學習 Java 的學習成本,因此繼續沿用了從 0 開始計數的習慣。實際上,很多語言中陣列也並不是從 0 開始計數的,比如 Matlab。甚至還有一些語言支援負數下標,比如 Python。