为什么大多数编程语言中的数组都从0开始

先说说为什么C语言的数组是从0开始:众所周知,C语言的数组是直接操作内存,那我们肯定得从内存的寻址开始说起,以“以行为主序”的分配为例:设数组的基址为LOC(a c1 c2),每个数组元素占据l 个地址单元,那么aij 的物理地址可用一线性寻址函数计算:

LOC(aij)=LOC(a c1 c2)+( (i- c1) *( d2 - c2 + 1)+ (j- c2) )*l

推广到一般的三维数组:A[c1..d1] [c2..d2][c3..d3],则aijk 的物理地址为:

LOC(i,j,k)=LOC(a c1 c2 c3)+( (i- c1) *( d2 - c2 + 1)* (d3- c3 + 1)+(j- c2) *( d3- c3 + 1)+(k- c3))*l

显然,此处的c1 c2 c3 为0 会大大简化计算,越是多维数组效果越明显。这对于计算机寻址计算来说显然好处是大大的啊,这就是为什么最早C语言的数组起始都是0,至于什么其他的原因觉得美啊什么的都是后来人们YY的。事实上,在现在很多时候计算不再是瓶颈的时候,数组的下标也有从1开始的,比如matlab,难道matlab就不美了么?

由于C语言发明较早,影响有很大,所以很多后来的编程语言都借鉴了C语言的特征,保持了数组下标从0开始,比如C++和Java等,当然一些语言的愿意有所不同,比如Python。为什么Python语言的下标也是从0开始,你可以看一下Python之父Guido van Rossum的说明:

https://plus.google.com/115212051037621986145/posts/YTUxbXYZyfi

译文可见:

http://blog.jobbole.com/58018/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的SOD蜜

巧用枚举类型,实现项目的多语言切换

在项目程序中实现多语言,有多种方式,而枚举类型的多语言处理,是比较头疼的问题。比如有下面这个枚举类型: public enum MySex { ...

2318
来自专栏

shell之sort命令

1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 [rocro...

2137
来自专栏take time, save time

你所能用到的BMP格式介绍(二)

一、可能你忽视的基础         在正式开始之前,我不得不从最基本的地方开始,因为这些地方大多数人会忽视的一干二净,如果不在开始进行说明,那么在后面一定会有...

3007
来自专栏企鹅号快讯

30分钟学会用Python编写简单程序

参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤。 了解遵循输入、处理、输出(IPO)模式的程序,并能够以简单的方式修改它...

66210
来自专栏量化投资与机器学习

【精心解读】用pandas处理大数据——节省90%内存消耗的小贴士

本文我们讨论 pandas 的内存使用,展示怎样简单地为数据列选择合适的数据类型,就能够减少 dataframe 近 90% 的内存占用。

1.8K5
来自专栏行者悟空

我眼中的并发编程——Fork/Join模型

2045
来自专栏Java技术栈

跟我学 Java 8 新特性之 Stream 流(三)缩减操作

和前面两篇文章一起服用,效果会更佳。通过对流API的基础体验Demo和关键知识点的讲解,相信大家对流API都有一定的认识了,但是流API强大的功能,可不仅仅像前...

914
来自专栏小樱的经验随笔

UESTC 1599 wtmsb【优先队列+排序】

题目链接:UESTC 1599 wtmsb 题意:给你一组数,每一次取出两个最小的数,将这两个数的和放入这组数中,直到这组数只剩下一个,求最后剩下那个数的大小!...

2766
来自专栏C/C++基础

基数排序简介及其并行化

  基数排序号称线性时间排序算法中性能最好,速度最快的排序算法。本文将简要概括其算法思想,串行代码及其并行化。

1441
来自专栏aoho求索

由散列表到BitMap的概念与应用(一)

散列表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触散列表时,它的优点多得让人难以置信。不论散列表中有多少数据,插入和删除只需要接近常量的时间即O...

1132

扫码关注云+社区

领取腾讯云代金券