promotion image of download ymail app
Promoted

為什麼電腦語言要從 0 開始呢!?

為什麼電腦要 0 零開始?!而不是從 1 開始呢??

資料結構老師問的!!

4 Answers

Rating
  • Dave
    Lv 7
    1 decade ago
    Favorite Answer

    http://en.wikipedia.org/wiki/Array#Indices_into_ar... 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)

    • Commenter avatarLogin to reply the answers
  • 1 decade ago

    google一下找到的討論串...^^

    Why array index starts from 0(zero)?

    http://forum.java.sun.com/thread.jspa?threadID=763...

    Why does an array index start at 0, not 1

    http://forum.java.sun.com/thread.jspa?threadID=357...

    • Commenter avatarLogin to reply the answers
  • 1 decade ago

    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 而言,那就是多一道手續。

    所以我才說:既然要多,就多個夠:可以由程式師自由對應!

    • Commenter avatarLogin to reply the answers
  • 1 decade ago

    開始為0: 0加1後>>1

    開始為1: 1加1後>>10

    所以一開始是1作邏輯運算(and,or,...)就很不方便

    以上為我個人觀點....如有錯誤請多見諒

    Source(s): 自己
    • Commenter avatarLogin to reply the answers
Still have questions? Get your answers by asking now.