本文转载自微信公众号《程序喵大师》,作者程序喵大师。转载本文请联系程序大师喵公众号。大家好,我是程序喵!众所周知,计算机是从0开始计数的,而不是我们通常使用的从1开始计数,但是你有没有想过这是为什么?其实并不是计算机是从0开始计数的,而是大多数编程语言的数组都是以0作为起始下标的,为什么呢?这道题超出了大纲,程序也看不懂,但是怀着对科学的敬畏之心,经过大量的查找和验证,终于找到了答案。故事也始于一位真正的老板,埃兹格·迪杰斯特拉(Dijkstra),他是迪杰斯特拉结构规划之父,提出了“goto有害理论”;提议的信号量和PV原语;解决了“哲学家的晚餐”问题;Dijkstra最短路径算法和银行家算法的创造者;操作系统的设计者和开发者;第一个Algol60编译器的设计者和实现者;与D.E.Knuth一起被称为我们这个时代最伟大的计算机科学家。这里引用大哥我翻译的:为了表示自然数1,2,3,4...14...的子序列,一般有四种表示序列的方式:a)2≤i<13b)1优雅的理由只有一个吗?其实下标从0开始的主要意思就是表示偏移量。举个例子:为什么数组的起始下标是0?事实上,数组是一个线性结构,它有一个连续的内存空间,存储一组相同类型的数据。如图,以一个长度为10的int类型数组为例,系统会为数据分配一块连续的内存空间,空间大小为40字节,内存块首地址base_address=100.数组可以随机访问。在访问第i个元素时,需要定位到第i个元素的地址。定位公式如下:第i个元素address=base_address+i*data_type_size其中data_type_size表示元素类型在数组中的大小,int类型大小为4字节,所以公式中data_type_size等于4。这里,下标可以理解为一个偏移量。数组的首地址为base_address,其中a[0]为偏移为0的位置,a[i]为偏移idata_type_size的位置,所以计算a[i]地址的公式为:a[i]address=base_address+i*data_type_size这里如果数组下标从1开始,那么a[i]address的公式就是:a[i]address=base_address+(i-1)*data_type_size的两个公式很明显.从0开始的下标比较简单,后者从1开始,每访问一个数组元素,都需要额外进行一次减法运算,效率较低。我们知道Python中的数组也是以0作为起始下标。Python之父GuidovanRossum对此也给出了肯定的回答,下面贴出他翻译的语录:大佬语录关于这个问题,有人在推特上问过,我回答了。这个问题我想了很久:ABC语言是Python的鼻祖之一,使用的索引是从1开始的,而另一种对Python有重要影响的C语言是从0开始的。之前的几种编程语言(Algol、Fortran、Pascal)用1作为起始索引,有的用一个变量作为索引。促使我使用0作为起始索引的原因之一是切片语法。我们先来看看切片的用例。也许切片最常见的用法是“取前n个元素”和“取从i开始的后n个元素”。如果不需要将这两种用法与+1或-1补偿操作一起使用,代码会非常优雅。使用从0开始的索引方式,上面的两个切片用法会很漂亮:a[:n]和a[i:i+n],前者是a[0:n]的缩写。使用从1开始的索引方法。如果想用a[:n]来表达取前n个元素的意思,既可以使用闭区间切片语法,也可以使用起始索引加上切片长度作为参数的方式。如果将半开区间切片法与从1开始的索引相结合,代码将变得不优雅。而如果你使用闭区间切片语法,为了从第i个索引中取出n个元素,你需要将表达式写成a[i,i+n-1]。似乎在1-basedindex方法中使用slicestartbit+length更合适?这样,你可以把它写成a[i:n],而ABC语言就是这样做的,你可以把它写成a@i|n这种特殊的语法。但是,index:length方法在其他情况下是否有效?我记不清了,但我想我真的被半开区间的优雅语法所吸引。特别是当两个切片操作相邻时,第一个切片的结束索引是第二个切片的起始索引,这种语法简直是美丽的。比如你想把一个字符串用i和j分成三份,这三份就是a[:i]、a[i:j]和a[j:],真是美极了。这就是Python使用0作为起始索引的原因。看到这里,你知道为什么很多编程语言都是从0开始计数了吗?文中如有翻译不当之处,请指正(可私聊或后台发给我),万分感谢!参考https://www.cs.utexas.edu/~EWD/transcriptions/EWD08xx/EWD831.htmlhttps://blog.csdn.net/csdnsevenn/article/details/107421466https://docle.github.io/2018/08/26/为什么编号应该从零开始/https://www.reddit.com/r/Python/comments/1p2za1/guido_van_rossum_why_python_uses_0based_indexing/
