如題,陣列第一個元素為什么要從零開始,而不從一開始?感覺這很反人類呀,正常來講,一個集合的開始,不應該從一嗎?
對于這個問題,我覺得可以從以下兩方面來考慮,
設計層面
我們先了解一下陣列最基本的結構和尋址方式(即實作方式),
現在市面上無論是C、Java、PHP,還是Go或者其他編程語言,他們陣列的實作方式,應該都是一樣的:一段連續的記憶體,

陣列在分配記憶體的時候,我們會知道陣列的開始地址(PS:在目前下標為零的情況下,也等同于陣列的第一個元素的地址);

因為陣列中每個元素的型別都是相同的,所以每種型別所占的記憶體大小是固定的,因而導致陣列中每個元素的所占的記憶體大小都是相同的

由此我們可以得出,陣列中每個元素地址的計算公式:

// n為陣列坐標,x為陣列開始的記憶體地址,size為每個元素的大小
array[n]的地址 = x + n * size
這是目前陣列尋址的計算公式; 但是這是小標起始為0的時候,假如我們想讓陣列的起始下標變為1,則公式會變成什么樣呢?
//n為陣列坐標,x為陣列開始的記憶體地址,size為每個元素的大小
array[n]的地址 = x + (n - 1) * size
對比以上兩個公式,會發現,如果用下面的公式,僅僅是多了一個"n - 1"的運算!
要知道,陣列是計算機語言的最最基本的組成單元,所有的計算機編程語言的其他組成部分,包括各種類別庫,各種特殊的資料結構(如Golang的channel)和語法欄位等,都是基于陣列等這些最最基本的組成單元之上做的封裝;
假如我們把陣列從1開始,對陣列而言只是多了一步計算,但是,對于整個編程語言的系統而言,將會是多了無數次計算!所以:在編程語言的設計中,對于陣列等這些最最基本的編程操作,要把效率做到極致!因此,陣列的起始下標會是0開始,
歷史原因
還有一個比較重要的原因我覺得是歷史使然,當初初級編程語言陣列的設計(例如C),就是由零開始的;開發者們都熟悉了這種編程方式,導致后來陸陸續續出現的高級編程語言都延續了這個習慣,
如果你想學習更多編程,小編推薦我的C語言/C++編程學習基地【點擊進入】!
都是學編程小伙伴們,帶你入個門還是簡簡單單啦,一起學習,一起加油~
還有許多學習資料和視頻,相信你會喜歡的!
涉及:游戲開發、常用軟體開發、編程基礎知識、課程設計、黑客等等......

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/3000.html
標籤:C
上一篇:學習第22天
下一篇:Java中你所不知道的null
