日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?

發(fā)布時(shí)間:2025/3/16 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

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

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

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

Dijkstra通過分析,得出在進(jìn)行范圍表達(dá)的時(shí)候,使用左閉右開的方式更加合理。

但是,Dijkstra在分析出2 ≤ i < 13這種形式更加合理之后,他有陷入了另外一個(gè)思考,那就是:

當(dāng)處理長(zhǎng)度為 N 的序列時(shí),到底第一個(gè)元素的下標(biāo)使用0還是1更加合適?

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

他認(rèn)為,使用左閉右開的表達(dá)方式,當(dāng)下標(biāo)從 1 開始時(shí),下標(biāo)范圍為 1 <= i < N+1;當(dāng)下標(biāo)從 0 開始時(shí)則是 0 <= i < N;

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

計(jì)數(shù)表示偏移量

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

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

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

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

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

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

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

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

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

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

因?yàn)閹缀跛杏?jì)算機(jī)結(jié)構(gòu),都借由位址和偏移量來表示直接引用內(nèi)存,所以,像C語言這種使用0做為數(shù)組的第一個(gè)下標(biāo)使得語言的實(shí)現(xiàn)上更加容易。

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

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

Python作者的解釋

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

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

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

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

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

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

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

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

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

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

特別是當(dāng)兩個(gè)切片操作位置鄰接時(shí),第一個(gè)切片操作的終點(diǎn)索引值是第二個(gè)切片的起點(diǎn)索引值時(shí),太漂亮了,無法舍棄。

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

有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

歡迎大家關(guān)注Java之道公眾號(hào)

好文章,我在看??

新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

總結(jié)

以上是生活随笔為你收集整理的漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产美女引诱水电工 | 爱操在线 | 亚洲欧美中文日韩在线v日本 | 美女擦边视频 | 国产一区在线观看视频 | 精品无码久久久久久久久 | 国产精品福利在线观看 | 少妇太紧太爽又黄又硬又爽 | 综合激情久久 | 国产精品毛片在线 | 欧美激情天堂 | www.18av| 亚洲一区二区视频 | 丝袜在线一区 | 少妇精品在线 | 久久久久亚洲AV成人网人人小说 | 黄色18网站 | 日韩少妇高潮抽搐 | 看了下面会湿的视频 | 高清视频免费在线观看 | 国产精品一区二区三区四 | 欧美真人性野外做爰 | 色偷偷一区二区三区 | 日日操夜夜操视频 | 精品在线视频观看 | 欧美精品一区二区三区四区五区 | youjizz麻豆 | 亚av在线 | 国产肉体ⅹxxx137大胆 | 日韩福利片 | 啪啪导航| 亚洲成人av一区二区 | 2020av视频 | 日韩天堂av | 精品黑人一区二区三区国语馆 | 麻豆国产在线播放 | 国产一区激情 | 国产在线18| 浪潮av网站 | 宝贝乖h调教灌尿穿环 | 亚洲久久久 | www.亚洲欧美| 在线观看成人一区 | 韩国av电影在线观看 | 久久久久久久久国产精品一区 | wwwjizzzcom| 成人毛片在线播放 | 成人毛片视频免费看 | 亚洲国产无码久久 | av东方在线| 在线观看91av | 国产亚洲精品久久久 | 午夜精品视频一区二区三区在线看 | 久久国产一区二区三区 | 亚洲逼 | xxxxxx日本 | 色婷婷狠狠18禁久久 | 午夜aaa| 爱爱的网站 | 天天夜夜操 | 五月丁香 | 91麻豆精品秘密入口 | 日女人免费视频 | 久久精品无码毛片 | 亚洲黄色小视频 | 美女狂揉羞羞的视频 | 超碰人人人人人人 | 欧美高清视频在线观看 | 爱爱视频日本 | 亚洲精品人妻无码 | 黑人操中国女人视频 | 中文字幕乱码亚洲精品一区 | 希岛婚前侵犯中文字幕在线 | 国产一级片一区二区 | 天堂在线亚洲 | www.白浆| 欧美二区在线观看 | 激情亚洲色图 | 婷婷天堂网 | 国产女主播在线观看 | 欧美综合图区 | 亚洲网址在线 | 中文字幕av播放 | 爱爱免费视频网站 | 黑白配高清国语在线观看 | 亚洲自拍在线观看 | 污污网站在线免费观看 | 97超碰在线免费观看 | 日韩在线第三页 | 美国av导航 | 亚洲色图27p | 日本乱子伦 | 男人的天堂在线 | 天天舔天天摸 | 制服丝袜在线一区 | 97人人模人人爽人人少妇 | 毛片av免费看| 乱视频在线观看 | 久草在现|