为什么数组下标是从0开始?

也不是所有的高级程序语言都是如此,比如Python数组下标就支持负数。

原因一:历史原因

语言出现顺序从早到晚C、Java、JavaScript。

C语言数组下标是从0开始->Java也是->JavaScript也是。

降低额外的学习和理解成本。

原因二:减少CPU指令运算

(1)下标从0开始:

数组寻址——arr[i] = base_address + i * type_size(1)

其中base_address为数组arr首地址,arr0就是偏移量为0的数组,即数组arr首地址;i为偏移量,type_size为数组类型字节数,比如int为32位,即4个字节。

(2)下标从1开始:

数组寻址——arr[i] = base_address + (i -1)* type_size(2)

比较两个计算公式可以发现公式(2)每次CPU寻址需要多一次 i-1的操作,即多了一次减法的指令运算。

对于数组这种基础数据结构,无论在哪种高级程序语言中,都是频繁间接(作为容器的基础数据结构,比如Java的ArrayList)或者直接被使用的,因此要尽量减少其消耗CPU资源。

原因三:物理内存的地址是从0开始的

计算机主存是多个连续字节大小的单元组成的数组,每个字节都对应唯一的物理地址,第一个字节的地址为0。

微信公众号:技术很有趣

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xcywt

关于delete 和 new

关于new和delete,有如下代码 // new_test.cpp #include<iostream> using namespace std; cl...

2036
来自专栏偏前端工程师的驿站

JS魔法堂: Native Promise Only源码剖析

一, 前言                                深入学习Promise的朋友应该都看过<深入理解Promise五部曲>这一系列的文章,...

2189
来自专栏Android 研究

Java虚拟机基础——3类加载机制

在这个框架图很容易大体上了解Java程序工作原理。首先当程序员写好.java文件后,需要先运行(假设该文件为demo.java)

1234
来自专栏IT技术精选文摘

易犯的Java内存泄漏代码

Java隐式地通过GC(守护线程)回收内存。 GC定期检查是否存在无法访问的对象,或者确切地说,没有指向该对象的引用。如果是这样,GC回收新可用的内存。 现在...

2227
来自专栏沈唁志

提高PHP编程效率的53个要点

2116
来自专栏游戏开发那些事

【游戏开发】小白学Lua(上)

  在很多游戏中,脚本语言是不可或缺的一部分,很多游戏都使用到了Lua,js,python一类的脚本,脚本语言可以在很多方面给开发进程带来帮助。脚本语言可以作为...

1532
来自专栏小灰灰

Nginx 路由转发配置笔记

Nginx 路由转发配置笔记 由于预算有限,只有一台服务器,想要玩的东西不少,所以这个台服务器上会提供多重服务,因此涉及到的nginx转发就必有重要了 由ng...

7406
来自专栏编程

大神用Python编写虚拟机解释器

群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流 ? 环境介绍 环境采用带桌面的Ubuntu L...

2148
来自专栏欧阳大哥的轮子

深入解构iOS系统下的全局对象和初始化函数

事件源于接入了一个第三方库导致应用出现了大量的crash记录,很奇怪的是这么多的crash居然没有收到用户的反馈信息! 在这个过程中每个崩溃栈的信息都明确的指向...

2252
来自专栏重庆的技术分享区

AngularJs指令解密

1707

扫码关注云+社区

领取腾讯云代金券