有什麼特別的原因嗎?我知道這就是這種語言的寫法,但我們不能改變它嗎? 如果索引從1開始,我們會面臨什麼樣的挑戰?爲什麼數組的索引/列表不以1開頭?
回答
出於歷史原因,以及與數組如何在內存中「製造」有關的原因。
在C中,數組是一塊內存(在其大小上具有編譯器級別的一些信息)。你有一個指向它的第一個元素的指針(一個引用)。要進入它的第二個元素,你可以做
int array[10]; // your array
int *p = array; // reference to first element of array
int *q = p + 1; // reference to second element of array
int *r = p + 2; // reference to third element of array
顯然,對於對稱:
array[0] // reference to first element of array
array[1] // reference to second element of array
array[2] // reference to third element of array
C的[x]
運營商實際上是在編譯爲array + x
。
你看?數組在C中是「基數0」。因此在許多其他語言中它是相同的。現在,C++的根源在C,Java有它的根源在C++和其他語言,C#的根源在C++,Java和其他語言中......同一棵樹。
基本顯然是另一個樹:-)
偉大的,你提到「在許多其他語言」,因爲基於0的指數不是一個石頭法律graven。 – Hyperboreus
事實上,在這個問題所有的語言都對C. – thagorn
的頂部,但在'Matlab'從指數'1' :) –
的基本原因後面它是計算機在至極任何變量的第一部分記得地址/對象被存儲。所以這個指數代表了這個和你要找的東西之間的「距離」,所以第一個是0,第二個1 ...
好問題。實際上,幾乎所有的編程語言實現都以0開始索引。
儘管您可能使用變通方法使它看起來像是從1開始,但不要。
Dijkstra的文章會給從零開始陣列的一個更好的防守比我:
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
的一件事是,你可以參考和使用指針導航陣列。事實上,數組操作會衰減到後端的指針運算。
假設你想達到的陣列的nth
元件這時可以簡單地做(a + n)
其中a
是一個數組(1維)的基地址,但是,如果下標開始於1
然後到達nth
元件你必須一直做(a + n -1)
。
這是因爲僅僅通過取一個數組的名字就可以知道它的起始元素的地址,這是最簡單的方法!
在C和C++中,數組索引是用於解引用偏移指針的語法糖。即, array[i]
相當於*(array + i)
。指針指向內存塊的開始是有意義的,這意味着數組的第一個元素需要爲*array
,這只是array[0]
。
- 1. 爲什麼數組索引或基索引以0開頭?
- 2. 爲什麼我不能通過列表理解索引數組?
- 3. 爲什麼SQL表名不能以數字開頭?
- 4. StringComparison,爲什麼「TH」不以「T」開頭
- 5. 爲什麼sqlite3_bind_ *從索引1開始,但sqlite3_column_ *從0開始?
- 6. 爲什麼「1」被存儲在所有數組索引位置?
- 7. 如何在mysql中自動增加以500開頭的索引不爲1
- 8. 爲什麼Scala元組的索引爲1?
- 9. 爲什麼不能用索引列表索引一個python列表?
- 10. 爲什麼不用一個負數作爲索引的數組?
- 11. PLPGSQL數組索引從1開始?
- 12. 創建JSON數組索引開始1
- 13. 爲什麼我的循環似乎從索引1開始?
- 14. 爲什麼不列表浮動到div的開頭?
- 15. 什麼是數組索引?
- 16. 爲什麼數組不打印列表?
- 17. 爲什麼我的數組搜索返回0而不是1?
- 18. 爲什麼列表索引必須是整數,而不是元組?
- 19. 爲什麼我的Vim以replacemode開頭?
- 20. 爲什麼參數名稱不能以數字開頭?
- 21. 爲什麼textbox id不允許以asp.net中的數字開頭?
- 22. 爲什麼[:: - 1]反向列表而不是僅返回第一個索引?
- 23. 爲什麼NumPy高級索引會爲列表和numpy數組列表產生不同的結果?
- 24. 爲什麼我使用「我」作爲我的數組索引後得到1?
- 25. 以文本作爲索引的列表或數組?
- 26. 爲什麼Mysql不在索引列上使用INNER JOIN表的索引?
- 27. 爲什麼數組邊界索引也可以使用?
- 28. 爲什麼變量不能以數字開頭?
- 29. 爲什麼標識符不能以數字開頭?
- 30. 爲什麼ASP.Net事件以「On」開頭
您忘了選擇此語言的Eiffel,Smalltalk和序言。 – WhozCraig
[爲什麼要編號從零開始:Dijkstra算法(http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF) –
爲什麼它不與-1開始? – BenDundee