为什么数组从0开始

来源:互联网 发布:麻将判断胡牌算法 编辑:程序博客网 时间:2024/05/15 15:34

今天看到一篇文章,《Python语言的创始人解释为什么Python数组的索引从0开始》http://www.aqee.net/why-python-uses-0-based-indexing/.


他给的理由是:

"使用0-based的索引方式,Python的半开区间切片和缺省匹配区间切片语法变得非常漂亮:a[:n] 和 a[i:i+n],前者的标准写法就是a[0:n]。"

a[:n]表示取从0到n-1这n个元素.即是[ )这样一个前闭合,后开的半开区间.

a[i:i+n]表示取从a[i]到a[i+n-1]这n个元素.而对于下标从1开始的数组就不能这么简单的表示.在使用半闭合切片方式时,如果用1开始的,就会表示成a[i,i+n-1]


你想将一个数组以i,j两个点切成三部分——这三部分将会是a[:i]a[i:j]a[j:]

a[:i]表示取了前i个元素,

a[i:j]表示取了从a[i]开始到a[j-1]结束。共j-i个元素

a[j:]表示取从a[j]开始到最后一个元素。


若用基于1的半开区间表示:

a[1,i+1]

a[i+1,j+1]

a[j+1,最后]

若用基于1的闭区间表示:

a[1,i]

a[i+1,j]

a[j+1,最后]


可见都没有使用基于0的半开区间方便。


查了一下,有一篇http://exple.tive.org/blarg/2013/10/22/citation-needed/说是决定使用基于0的数组的创始人http://www.cl.cam.ac.uk/~mr10/给的答案是:


As for BCPL and C subscripts starting at zero. BCPL was essentially designed as typeless language close to machine code. Just as in machine code registers are typically all the same size and contain values that represent almost anything, such as integers, machine addresses, truth values, characters, etc. BCPL has typeless variables just like machine registers capable of representing anything. If a BCPL variable represents a pointer, it points to one or more consecutive words of memory. These words are the same size as BCPL variables. Just as machine code allows address arithmetic so does BCPL, so if p is a pointer p+1 is a pointer to the next word after the one p points to. Naturally p+0 has the same value as p. The monodic indirection operator ! takes a pointer as it’s argument and returns the contents of the word pointed to. If v is a pointer !(v+I) will access the word pointed to by v+I. As I varies from zero upwards we access consecutive locations starting at the one pointed to by v when I is zero. The dyadic version of ! is defined so that v!i = !(v+I). v!i behaves like a subscripted expression with v being a one dimensional array and I being an integer subscript. It is entirely natural for the first element of the array to have subscript zero. C copied BCPL’s approach using * for monodic ! and [ ] for array subscription. Note that, in BCPL v!5 = !(v+5) = !(5+v) = 5!v. The same happens in C, v[5] = 5[v]. I can see no sensible reason why the first element of a BCPL array should have subscript one. Note that 5!v is rather like a field selector accessing a field in a structure pointed to by v.


翻译:

对于BCPLC的下标从0开始.BCPL本质上被设计成无类型的语言,类似于machine code.就像machinecode中的寄存器,它们都拥有相同的大小,存储的内容可以表示为任何东西,比如整型,机器地址,truth values,字符等等.

BCPL拥有无类型变量,就像机器中可以存储表示任何东西的寄存器一样.

 

如果BCPL变量表示一个指针,它就指向一个或者多个连续的内存块,每块大小都是一样的.正如机器码,BCPL也允许地址的计算..如果p是一个指针,那么p+1就指向紧接着p所指向的那个内存块后面一个的地方.

自然,p+0p指示的是同一个位置.

没有必要让p+1表示该数组中的第一个元素.

使用间接运算符"!"取得所指位置中的内容.如果v是一个指针,那么"!(v+1)"就表示v所指内存后面那块中的内容.

 

随着i0开始增大,我们就可以访问从v指向的内存开始的连续的空间中的内容.

 

"!"也可以这么用: v!i,同样可以表示 !(v+i).

非常自然的想到,在一个数组中,第一个元素的下标从0开始.

 

C语言中的"*"作用和BCPL中的"!"一样,间接运算符.[]作为数组下标.


Note :

BCPL v!5 = !(v+5) =!(5+v) = 5!v

C语言中 a[1] = 1[a]


此外,还有一些理由说是因为从0起可以节省编译时间.

http://exple.tive.org/blarg/2013/10/22/citation-needed/


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 支付宝绑定银行卡要验证码怎么办 微信红包超出20万限额怎么办 微信充电信的号码话费没到账怎么办 农业银行手机银行转账转错了怎么办 微信钱包里的零钱不见了怎么办 买家说支付宝没钱要微信付钱怎么办 微信红包没绑卡密码忘了怎么办 手机微信红包密码忘了怎么办 qq账号忘了怎么办什么也没绑定 手机银行转账名字对卡号错了怎么办 手机夸行转账卡号输入错了怎么办 移动开通了20元流量卡怎么办? 联通手机充值卡网上充值话费怎么办 提现金额和实际到账不一样怎么办 二冲踏板冷车加油熄火怎么办? qq被盗绑定了别人的银行卡怎么办 如何更改微信支付密码忘记了怎么办 微信钱包没绑银行卡忘记密码怎么办 微信密码忘记了也没绑银行卡怎么办 微信支付密码忘记了没银行卡怎么办 想找回原来的k歌忘了密码怎么办 手机微信钱包支付密码忘了怎么办 微信支付账户被注销了怎么办 微信钱包密码忘了怎么办没绑银行卡 微信钱包密码忘了怎么办不用银行卡 企业网银密码输入三次错误怎么办 微信密码不知道手机也停用了怎么办 手机停用微信密码不记得了怎么办 农商银行登入密码忘记了怎么办 苹果手机忘记四位数解锁密码怎么办 银行卡用支付宝支付限额了怎么办 用银行卡号找回微信被盗密码怎么办 微信钱包密码错误被锁定怎么办 本人没玩财付通结果被扣了钱怎么办 我的银行卡给支付宝充不了钱怎么办 支付宝话费充错了怎么办啊 已充值成功送朋友话费不能送怎么办 微信绑定银行卡被盗刷q币怎么办 微信红包过了24小时没退回怎么办 微信6.67版本红包发错了怎么办 苹果6s还原后激活出错怎么办