為什麼電腦要 0 零開始?!而不是從 1 開始呢??
資料結構老師問的!!
2006-10-18 20:38:20 · 4 個解答 · 發問者 欣茹 3 in 電腦與網際網路 ➔ 程式設計
http://en.wikipedia.org/wiki/Array#Indices_into_arrays基本上,也並不是所有的語言的 Indices 都是從 0 開始的;一些比較新,比較 User-Friendly 的語言 (大多是 Script 類型的語言),他們的 Indices 是從 1 開始的…從 Wiki 的解釋來說,基本上,從0還是從1開始並沒什麼重要的不同…而之所以大多的電腦語言的陣列 Indices 是從 0 開始,是因為歷史的原因… 現今大多的電腦語言都或多或少都受到 C 語言的影響 (for, if/else, while 這一些 keyword 都是一開始從 C 語言來的)… 而在 C 語言中,陣列的定義很薄弱,基本上,在 C 裡的陣列定義只是告訴他陣列開始的位置 (沒有 Bound Check ),而在陣列中的第3個元素的 Indices 被定義成第3個元素跟第1個元素之間相差的距離 (Offset,所以就是 3-1 = 2),而不是 "3"…所以後來的語言,受到 C 語言的影響,就延用了這一個定義… (這也有一個好處,因為這樣一來,有學過 C 語言的,學這些新的語言也比較輕鬆) 所以事實上從 0 還是從 1 開始,並無技術上的特別原因,只不過因為一開始的 C 語言決定用 0 開始,如些而已…
2006-10-19 09:17:34 補充:
-----事實上,Wiki 裡也有說,雖然我們人在生活中好像所有的東西都是從1開始算的,也有一些東西是從0開始算的… 它舉一個例子就是西元年的算法… 事實上,2000 年我們慶祝千囍年,根本就慶祝錯了… 因為 1999到2000年,事實上只過了1999年,並不是2000年 (因為我們有西元 0 年)…真正的千囍年應該是在2000->2001年時慶祝才是… (嗯,大家都犯了 off-by-one error)
2006-11-06 16:20:58 補充:
嗯,你說的A[1]用到a+1這一個位罝是 compiler 所指派的… 所以在 compile 的時候,compiler 大可以幫寫程式的人一個忙,一樣只allocate 3 bytes的記憶體,並定義a[1]指到的是第一塊的位置… 所以,indice從0還是從1開始並無差別,只是定義問題而已…(C語言定義是從0)
2006-11-06 16:23:14 補充:
沒錯,就像你說的,有些compiler很flexible,可以隨便你定indice的range… 但對很多人來說,從"1"開始數數是最自然的,所以才會有要從0還是1開始的這一個問題… (0這一個抽象數字,也是在自然數出現很久之後才出現的,對人們來說,比較困難理解)
2006-11-07 10:21:24 補充:
嗯,大概是因為你C程式寫久了,才會覺得A[2]對應到a+1很奇怪,對普通人來說,他不管(事實上也不需要知道)陣列在記憶體是如何配置的… 所以對普通人來說,A[2]對應到這一個陣列中的第"2"個位置,應該才是最直覺的吧?(而不是A[1]才是對應到第2個位置)
事實上,compiler在A[1]對應到a,大可以在allocate記憶體時就把陣列的base address記錄成實際被allocate的位子再減1… 這樣一來,所有以後的indice,直接加base-address一樣是指到正確的位置(也沒有其他的overhead)
2006-10-19 05:13:36 · answer #1 · answered by Dave 7 · 0⤊ 0⤋
google一下找到的討論串...^^
Why array index starts from 0(zero)?
http://forum.java.sun.com/thread.jspa?threadID=763091&start=0&tstart=0
Why does an array index start at 0, not 1
http://forum.java.sun.com/thread.jspa?threadID=357877&start=0&tstart=0
2006-11-11 12:37:00 · answer #2 · answered by Rebecca 3 · 0⤊ 0⤋
Wiki 的解釋不見得是對的!!
而且,題目問的是電腦,002選的 Wiki 文章是針對 Array,只是電腦的一部份。不過,Array 是很重要、非用、很好的例子倒是真的。
從0或從1絕對有差!!
從1,人方便,從0電腦方便。
現代的電腦講就人方便,所以多從1開始!
2006-11-05 01:08:06 補充:
如,宣告A[3],如果由1開始,就有 A[1]~ A[3]可用;由0則是A[0]~A[2]。
考慮譯成執行碼:
A[i] = a(A的位址) + i
如果從0,就是用a, a+1, a+2 這3組RAM;
如果從1,就是用 a+1, a+2, a+3 這3組RAM。
而a+0(就是a本身啦)那組RAM就沒人用了!浪費了一塊!
要不要揀回a那塊RAM,就看:
1. 現代RAM大,沒太大差別
2. Compiler對映時,用 a 指向 本來的a -1的位址,於是 A[1] 就是 a,沒有浪費RAM,但卻用了時間,且增加Compiler的困難與可讀性。
2006-11-05 01:08:44 補充:
即然要揀回 a 要增加Compiler的東東,要加就加個夠:像 ForTran (還是哪種語言,我忘了),陣列足標可以由程式師自訂範圍:可以從負的開始!!
2006-11-06 22:50:54 補充:
若,A[1]對應到 a,
那,&(A[2])呢?對應到 a+1!!
2 == 1 !!!!!
對 compiler 和 程式師都是麻煩!
對 compiler 而言,A[1] 對應到 a,就是要額外的code:它要 offset 一組byte!
它offset 完再對應,多數的程式不會變慢,也不會變大;
但,對compiler 而言,那就是多一道手續。
所以我才說:既然要多,就多個夠:可以由程式師自由對應!
2006-11-04 20:07:50 · answer #3 · answered by ? 7 · 0⤊ 0⤋
開始為0: 0加1後>>1
開始為1: 1加1後>>10
所以一開始是1作邏輯運算(and,or,...)就很不方便
以上為我個人觀點....如有錯誤請多見諒
2006-10-18 23:18:53 · answer #4 · answered by 智凱 2 · 0⤊ 0⤋