為什麼數組要從零開始? 如題,數組第一個元素為什麼要從零開始,而不從一開始?感覺這很反人類呀,正常來講,一個集合的開始,不應該從一嗎? 對於這個問題,我覺得可以從以下兩方面來考慮。 1設計層面 我們先瞭解一下數組最基本的結構和定址方式(即實現方式)。 現在市面上無論是C、Java、PHP,還是Go或 ...
為什麼數組要從零開始?
如題,數組第一個元素為什麼要從零開始,而不從一開始?感覺這很反人類呀,正常來講,一個集合的開始,不應該從一嗎?
對於這個問題,我覺得可以從以下兩方面來考慮。
1設計層面
我們先瞭解一下數組最基本的結構和定址方式(即實現方式)。
現在市面上無論是C、Java、PHP,還是Go或者其他編程語言,他們數組的實現方式,應該都是一樣的:一段連續的記憶體。
數組在分配記憶體的時候,我們會知道數組的 開始地址 (PS:在目前下標為零的情況下,也等同於數組的第一個元素的地址)
因為數組中每個元素的類型都是相同的,所以每種類型所占的記憶體大小是固定的,因而導致數組中每個元素的所占的記憶體大小都是相同的
由此我們可以得出,數組中每個元素地址的計算公式:
// n為數組坐標,x為數組開始的記憶體地址,
//size為每個元素的大小
這是目前數組定址的計算公式;但是這是小標起始為0的時候,假如我們想讓數組的起始下標變為1,則公式會變成什麼樣呢?
// n為數組坐標,x為數組開始的記憶體地址,size為每個元素的大小
array[n]的地址 = x + (n - 1) * size
對比以上兩個公式,會發現,如果用下麵的公式,僅僅是多了一個"n - 1"的運算!
要知道,數組是電腦語言的最最基本的組成單元,所有的電腦編程語言的其他組成部分,包括各種類庫,各種特殊的數據結構(如Golang的channel)和語法欄位等,都是基於數組等這些最最基本的組成單元之上做的封裝;
假如我們把數組從1開始,對數組而言只是多了一步計算,但是,對於整個編程語言的系統而言,將會是多了無數次計算!所以:在編程語言的設計中,對於數組等這些最最基本的編程操作,要把效率做到極致!因此,數組的起始下標會是0開始。
2歷史原因
還有一個比較重要的原因我覺得是歷史使然,當初初級編程語言數組的設計(例如C),就是由零開始的;開發者們都熟悉了這種編程方式,導致後來陸陸續續出現的高級編程語言都延續了這個習慣。
本文由博客一文多發平臺 OpenWrite 發佈!