回複內容:
提供兩個連結:
1. Why does the indexing start with zero in 'C'? (http://stackoverflow.com/questions/7320686/why-does-the-indexing-start-with-zero-in-c
)
2. Why numbering should start at zero, by Dijkstra. (http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF
)不是全部,Pascal類語言就可以不從0開始計數,比如從-100..100考慮C語言指標
int a[10];
那麼 a[0] === *(a+0)
我認為是這麼考慮的先說說為什麼C語言的數組是從0開始
眾所周知,C語言的數組是直接操作記憶體,那我們肯定得從記憶體的定址開始說起:
以“以行為主序”的分配為例:設數組的基址為LOC(a c1 c2),每個數組元素佔據l 個地址單元,那麼aij 的物理地址可用一線性定址Function Compute:
LOC(aij)=LOC(a c1 c2)+( (i- c1) *( d2 - c2 + 1)+ (j- c2) )*l
推廣到一般的三維數組:A[c1..d1] [c2..d2] [c3..d3],則aijk 的物理地址為:
LOC(i,j,k)=LOC(a c1 c2 c3)+( (i- c1) *( d2 - c2 + 1)* (d3- c3 + 1)+ (j- c2) *( d3- c3 + 1)+(k- c3))*l
顯然,此處的c1 c2 c3 為0 會大大簡化計算有木有啊!!越是多維陣列效果越明顯
這對於電腦定址計算來說顯然好處是大大的啊
這就是為什麼最早C語言的數組起始都是0
至於什麼其他的原因覺得美啊什麼的都是後來人們YY的
事實上,在現在很多時候計算不再是瓶頸的時候,數組的下標也有從1開始的
比如matlab
難道matlab就不美了麼= = 從技術實現上講,數組的下標就是記憶體的位移量吧。如p指標指向數組的記憶體,p+0就是第一個元素的記憶體位址,p+n ×sizeOfElement就是第n個元素的記憶體位址學C語言的時候這麼理解過:
數組名a就是數組第一個元素的記憶體位址
而取數組元素,就是通過a地址訪問記憶體的過程
取第1個元素,就是*(a+0)
取第2個元素,就是*(a+1),
...
所以下標從0開始不見得吧,ObjectPascal中數組可以從1開始,這個“從零開始”的問題,我個人認為這是個人為的曆史遺留問題,就像現在的電腦鍵盤的字母分布,沒有什麼特殊理論依據很多語言數組
不是從0開始的(比如 MATLAB),但是一位電腦科學先驅 Edsger Dijkstra(發明 Dijkstra 最短路演算法的那位)在 1982年寫過文章,推崇從0開始做下標,叫 “為啥得從0開始數數”。
全文在這裡:Why numbering should start at zero (EWD 831)
總結一下:
- 描述自然數子序列,上界和下屆的差應該是子序列的長度,數組下標可以理解為一個特殊的這種子序列。
- 下界應該包含資料內的元素,上屆應該不包含。換句話來說,下界應該是數組第一個索引。否則可能對於某些子序列,我們得用非自然數的實數作為下界。
- 如果考慮條件(1) 和 條件(2),描述上界和下界有兩個辦法:1 <= i < N+1 或者 0 <= i < N. 很顯然 N+1 作為上界太難看了,所以我們應該讓下標從 0 開始。。
翻譯自 Quora Travis Addair's answer to Why do array indices start with 0 (zero) in many programming languages?
不過翻譯完了感覺有些不大對勁。描述區間(根據最大值和最小值判定的實數集合)和描述程式語言中數組元素是兩碼事吧。。。還是從C語言的實現上解釋比較靠譜。在硬體上 計數什麼的都是從所有位全部為低電平(正邏輯)開始的,也就是無符號整型裡邊的0。0 <= a mod b <= b-1
0是+運算的么元,1是*運算的么元.
*比+用的多,所以用0.