5

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

 2 years ago
source link: https://hbuacm.github.io/2022/07/06/%E6%AF%8F%E6%97%A5%E5%88%86%E4%BA%AB2022day03%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BE%88%E5%A4%9A%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E4%B8%AD%E6%95%B0%E7%BB%84%E9%83%BD%E4%BB%8E0%E5%BC%80%E5%A7%8B%E7%BC%96%E5%8F%B7/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

HBUACM

为什么很多编程语言中数组都从0开始编号
发表于 2022-07-06| 更新于 2022-07-06|2022程序设计训练营每日分享
阅读量:1

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

从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移(offset)”。

如果用 a 来表示数组的首地址,a[0]就是偏移为 0 的位置,也就是首地址。

a[k]就表示偏移 k 个 type_size 的位置,所以计算 a[k]的内存地址就是

a[k]_address = base_address + k * type_size

我们拿一个长度为 10 的int 类型的数组int[] a = new int[10]来举例。

计算机给数组 a[10],分配了一块连续内存空间 1000~1039,其中,内存块的首地址为 base_address = 1000

计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。

当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:

a[i]_address = base_address + i * data_type_size //data_type_size 表示数组中每个元素的大小。
但是,如果数组从 1 开始计数,那我们计算数组元素 a[k]的内存地址就会变为

a[k]_address = base_address + (k-1)*type_size

从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。

数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致。

所以为了减少一次减法操作,数组选择了从 0 开始编号,而不是从 1 开始。

C 语言设计者用 0 开始计数数组下标,之后的 JavaJavaScript 等高级语言都效仿了 C 语言,或者说,为了在一定程度上减少 C 语言程序员学习 Java 的学习成本,因此继续沿用了从 0 开始计数的习惯。但也有一些语言中,数组也并不是从 0 开始计数的,比如 Matlab。甚至还有一些语言支持负数下标,比如 Python。


Recommend

  • 64

    有问题,上知乎。知乎是中文互联网知名知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。

  • 54

    本文盘点2019年比较热的技术点,大家好根据前端发展趋势对自己的技术栈做一定规划,抓住重点。 本文主要聊以下几个技术点: Vue, React, Angular WebAssembly,PWA

  • 71

    程序员 - @HarveyLiu - 不谈论,简洁问题,也不管静态,动态问题,只谈论写起来是否舒服,有没有违和感。

  • 35

    [译] 编程语言中的 6 种内存模型(2016) Published at 2019-11-09 | Last Update 2019-11-09 本文翻译自一篇英文博客 The memory models th...

  • 26
    • www.infoq.cn 5 years ago
    • Cache

    编程语言中的 6 个有趣特性

    Java 是一门不断发展的语言,这是一件好事。然而,其他语言的一些特性也是值得研究的。语言的结构是人们思考问题的方式,也是人们设计解决方案的方式。学习或至少熟悉其他语言是借鉴其设计的好方法。 Java 是我学习的第一门语言并...

  • 12
    • hiberabyss.github.io 3 years ago
    • Cache

    编程语言中的闭包

    闭包是现代的高级编程语言的一个重要概念, 本文会以 Golang 为例来介绍什么是闭包.什么是闭包 (Closure)在介绍闭包的定义之前, 我们先来看下闭包的示例代码:package mainimport "fmt"func greeting(name stri...

  • 5

    ...

  • 7

    最近在参与KusionStack 内置的领域语言 ——KCL配置语言编译器 的开发,语言的语法中包括一个“索引签名”的概念,在参与社区讨论的时候发现很多小伙伴不明白这个“索引签名”是什么,于是自...

  • 4

    代码审计:如何在全新编程语言中发现漏洞? 作者:悠悠PM10 2022-09-20 12:53:15 具有安全意识的开发者仍然可能产生漏洞,因为很多开发用不到的特性、甚至编程语言官方非预期的情景不是开发者掌握的知识,代码安全...

  • 9
    • www.techug.com 1 year ago
    • Cache

    各种编程语言中的 Lambda

    各种编程语言中的 Lambda 我喜欢看 Conor Hoekstra 的视频,一方面是因为他是一位引人入胜的主持人,另一方面是因为他介绍了很多很多编程语言。我不懂那么多语言,所以能接触到不同语言如何解决相同的问题是件...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK