如題,數(shù)組第一個(gè)元素為什么要從零開始,而不從一開始?感覺這很反人類呀,正常來講,一個(gè)集合的開始,不應(yīng)該從一嗎?
對(duì)于這個(gè)問題,我覺得可以從以下兩方面來考慮。
設(shè)計(jì)層面
我們先了解一下數(shù)組最基本的結(jié)構(gòu)和尋址方式(即實(shí)現(xiàn)方式)。
現(xiàn)在市面上無論是C、Java、PHP,還是Go或者其他編程語言,他們數(shù)組的實(shí)現(xiàn)方式,應(yīng)該都是一樣的:一段連續(xù)的內(nèi)存。

數(shù)組在分配內(nèi)存的時(shí)候,我們會(huì)知道數(shù)組的開始地址(PS:在目前下標(biāo)為零的情況下,也等同于數(shù)組的第一個(gè)元素的地址);

因?yàn)閿?shù)組中每個(gè)元素的類型都是相同的,所以每種類型所占的內(nèi)存大小是固定的,因而導(dǎo)致數(shù)組中每個(gè)元素的所占的內(nèi)存大小都是相同的

由此我們可以得出,數(shù)組中每個(gè)元素地址的計(jì)算公式:

// n為數(shù)組坐標(biāo),x為數(shù)組開始的內(nèi)存地址,size為每個(gè)元素的大小
array[n]的地址 = x + n * size
這是目前數(shù)組尋址的計(jì)算公式;
但是這是小標(biāo)起始為0的時(shí)候,假如我們想讓數(shù)組的起始下標(biāo)變?yōu)?,則公式會(huì)變成什么樣呢?
//n為數(shù)組坐標(biāo),x為數(shù)組開始的內(nèi)存地址,size為每個(gè)元素的大小
array[n]的地址 = x + (n - 1) * size
對(duì)比以上兩個(gè)公式,會(huì)發(fā)現(xiàn),如果用下面的公式,僅僅是多了一個(gè)"n - 1"的運(yùn)算!
要知道,數(shù)組是計(jì)算機(jī)語言的最最基本的組成單元,所有的計(jì)算機(jī)編程語言的其他組成部分,包括各種類庫,各種特殊的數(shù)據(jù)結(jié)構(gòu)(如Golang的channel)和語法字段等,都是基于數(shù)組等這些最最基本的組成單元之上做的封裝;
假如我們把數(shù)組從1開始,對(duì)數(shù)組而言只是多了一步計(jì)算,但是,對(duì)于整個(gè)編程語言的系統(tǒng)而言,將會(huì)是多了無數(shù)次計(jì)算!所以:在編程語言的設(shè)計(jì)中,對(duì)于數(shù)組等這些最最基本的編程操作,要把效率做到極致!因此,數(shù)組的起始下標(biāo)會(huì)是0開始。
歷史原因
還有一個(gè)比較重要的原因我覺得是歷史使然,當(dāng)初初級(jí)編程語言數(shù)組的設(shè)計(jì)(例如C),就是由零開始的;開發(fā)者們都熟悉了這種編程方式,導(dǎo)致后來陸陸續(xù)續(xù)出現(xiàn)的高級(jí)編程語言都延續(xù)了這個(gè)習(xí)慣。