為什麼很多程式語言中的陣列都是從0開始編號?
阿新 • • 發佈:2022-04-17
為什麼大多數程式語言中,陣列要從 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。