<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          漫話:如何給女朋友解釋為什么計算機從0開始計數(shù),而不是從1開始?

          2021-01-16 17:55


          導(dǎo)讀:為什么計算機從0開始計數(shù),而不是從1開始?


          作者 / 來源:漫話編程(ID:mhcoding)



          當我們想要寫一個循環(huán)體,期望執(zhí)行10次的時候,我們會使用以下方式:

          for?(int?i=0;?i<10;?i++){

          }

          可以看到,為了保證循環(huán)10次,我們定義了一個整數(shù)變量從0開始。

          還有,當我們定義數(shù)組的時候,在常見的C語言、Java、Python等語言中,都是使用下標0來表示第一個元素的。



          01 從0開始更優(yōu)雅

          我們分析過,Dijkstra通過分析,得出在進行范圍表達的時候,使用左閉右開的方式更加合理。

          但是,Dijkstra在分析出2 ≤ i < 13這種形式更加合理之后,他有陷入了另外一個思考,那就是:
          當處理長度為 N 的序列時,到底第一個元素的下標使用0還是1更加合適?

          關(guān)于這個分析,他的出發(fā)點很簡單,那就是哪種方式更加漂亮,更加優(yōu)雅。

          他認為,使用左閉右開的表達方式,當下標從 1 開始時,下標范圍為 1 <= i < N+1;當下標從 0 開始時則是 0 <= i < N;

          而顯然后面這種表達式更加漂亮、優(yōu)雅一些。所以,他建議我們使用0作為第一個下標。



          02 計數(shù)表示偏移量

          很多人學習編程都是從C語言開始的,那么,C語言就是一個典型的0-base語言(以0作為計數(shù)的開始),其實,這一約定早在BCPL時代就是這樣的了。

          在C語言還不叫C語言,還叫BCPL的時候,他的作者馬丁·理察德就設(shè)計了數(shù)組從0開始的索引方式。

          當我們在BCPL(C語言)中定義數(shù)組int arr[8]的時候,編輯器會在內(nèi)存中開辟一塊空間(這個空間中可能包含多個內(nèi)存單元)供該數(shù)組使用。

          為了能讓數(shù)組找到編譯器為自己開辟的空間,會把這塊內(nèi)存空間中第一個內(nèi)存單元的地址(0X0000001)賦值給這個數(shù)組,當我們使用&arr的時候,就可以拿到這塊地址。


          BCPL最初是用IBM 7094機器編譯的;它在編譯時會優(yōu)化這些數(shù)組索引提供的指針反參考運算(indirection),即可以通過指針取出地址中存儲的值,這個特性也一直延續(xù)到今天。

          有了指針之后,我們可以使用int *pr = arr的方式初始化一個指針,那么,這時候,指針pr也會指向數(shù)組的內(nèi)存空間的第一個內(nèi)存單元的地址。


          那有了數(shù)組和指針,想要使用這塊內(nèi)存第一個內(nèi)存單元存儲一個變量的時候,就需要想辦法表示這第一個空間。

          那么,BCPL的作者采用了0作為數(shù)組第一個元素的下標,因為他認為,數(shù)組的下標應(yīng)該和指針的偏移量是相對應(yīng)的。這樣在使用第一個內(nèi)存單元的時候,直接使用arr[0]或者*(p+0)就可以了。


          因為指針*(p+0)這種表達形式中的0表示的是偏移量,所以,無論數(shù)組的下標從幾開始,*(p+0)都是用于存取內(nèi)存中的p+0位址的值,也就是0X0000001這塊內(nèi)存單元的值。

          試想一下,如果使用1作為數(shù)組的起始下標,那么arr1就應(yīng)該指向0X0000001這塊內(nèi)存,但是*(p+1)按照偏移量的計算方式,需要指向0X0000005這塊內(nèi)存。這種情況下,如果想要讓*(p+1)和arr[1]指向同一塊內(nèi)存,就需要額外做一次減法指令。

          因為幾乎所有計算機結(jié)構(gòu),都借由位址和偏移量來表示直接引用內(nèi)存,所以,像C語言這種使用0做為數(shù)組的第一個下標使得語言的實現(xiàn)上更加容易。

          但是值得一提的是,在C語言流行起來之前,還是有很多1-base的編程語言的,如FORTRAN、BASIC等編程語言的數(shù)組下標都是從1開始的。

          隨著C語言的發(fā)揚光大,很多語言都參考了C語言的做法。



          03 Python作者的解釋

          關(guān)于這個問題,之前也有網(wǎng)友在Twitter上詢問過Python之父——Guido van Rossum,他給出過正面回答,我把回答內(nèi)容的翻譯版貼在下面:

          我記得自己就這個問題思考過很久;Python的祖先之一ABC語言,使用的索引是從1開始的(1-based indexing),而對Python語言有巨大影響的另一門語言,C語言的索引則是從0開始的。

          我最早學習的幾種編程語言(Algol, Fortran, Pascal)中的索引方式,有的是1-based的,有的是從定義的某個變量開始(variable-based indexing)。而我決定在Python中使用0-based索引方式的一個原因,就是切片語法(slice notation)。

          讓我們來先看看切片的用法??赡茏畛R姷挠梅?,就是“取前n位元素”或“從第i位索引起,取后n位元素”(前一種用法,實際上是i==起始位的特殊用法)。如果這兩種用法實現(xiàn)時可以不在表達式中出現(xiàn)難看的+1或-1,那將會非常的優(yōu)雅。

          使用0-based的索引方式、半開區(qū)間切片和缺省匹配區(qū)間的話(Python最終采用這樣的方式),上面兩種情形的切片語法就變得非常漂亮:a[:n]和a[i:i+n],前者是a[0:n]的縮略寫法。

          如果使用1-based的索引方式,那么,想讓a[:n]表達“取前n個元素”的意思,你要么使用閉合區(qū)間切片語法,要么在切片語法中使用切片起始位和切片長度作為切片參數(shù)。

          半開區(qū)間切片語法如果和1-based的索引方式結(jié)合起來,則會變得不優(yōu)雅。

          而使用閉合區(qū)間切片語法的話,為了從第i位索引開始取后n個元素,你就得把表達式寫成a[i:i+n-1]。

          這樣看來,1-based的索引方式,與切片起始位+長度的語法形式配合使用會不會更合適?這樣你可以寫成a[i:n]。事實上,ABC語言就是這樣做的——它發(fā)明了一個獨特的語法,你可以把表達式寫成a@i|n。

          但是,index:length這種方式在其它情況下適用嗎?說實話,這點我有些記不清了,但我想我是被半開區(qū)間語法的優(yōu)雅迷住了。

          特別是當兩個切片操作位置鄰接時,第一個切片操作的終點索引值是第二個切片的起點索引值時,太漂亮了,無法舍棄。

          例如,你想將一個字符串以i,j兩個位置切成三部分,這三部分的表達式將會是a[:i],a[i:j]和a[j:]。


          關(guān)于作者:漫話編程,是一個通過漫畫+音頻的形式講解枯燥的編程知識的公眾號。致力于讓編程變得更有樂趣。



          劃重點??


          干貨直達??



          更多精彩??

          在公眾號對話框輸入以下關(guān)鍵詞
          查看更多優(yōu)質(zhì)內(nèi)容!

          PPT?|?讀書?|?書單?|?硬核?|?干貨?|?講明白?|?神操作
          大數(shù)據(jù)?|?云計算?|?數(shù)據(jù)庫?|?Python?|?可視化
          AI?|?人工智能?|?機器學習?|?深度學習?|?NLP
          5G?|?中臺?|?用戶畫像?|?1024?|?數(shù)學?|?算法?|?數(shù)字孿生

          據(jù)統(tǒng)計,99%的大咖都完成了這個神操作
          ??


          瀏覽 31
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产免费又黄又爽 | 人人操人人色人人操 | 国产真人臊逼 | 狠狠躁夜夜躁 | 成人高清无码视频在线免费观看 |