1、聊一聊

相信大家都有看过电影,今天所分享的是其经典背景音乐,或许音乐响起你又会想起那条单纯、善良的秋田犬!

今天跟大家聊聊一个有意思的话题,C中的数组下标为啥是从0开始?或者说为什么现在大部分的编程语言都会选择从0开始索引!本文将从三个方面展开这个话题。

2、话题引出

凯爷,你见过数组下标从1开始的编程语言吗?

额~ ,我想想,似乎好像matlab的数组是从1开始的。

不会吧,感觉数组用1开始的编程语言很少吧!那为什么都是从0开始呢?1开始不是很好吗?

我在有些书上看过类似的解释,从0开始设计上会方便很多,应该也有一定的历史原因吧。管那么多干嘛,怎么规定怎么用就好了呀!

确实意义倒不大,不过我还是有些好奇,毕竟我是靠C吃饭的!

bug菌,你知道数组下标为何从0开始吗?

这个问题有点难为我了,毕竟我不是语言考古学家,不过我可以跟你聊聊我的一些想法,参考一下!

1

惯性思维

  • 从我们开始学习数数,并且用手指头开始比划着的时候,大人们就会教我们"1、2、3、4。。。。。。"一共10根手指。同样,当我们去别人家做客,然后问楼层的时候,也是第1层、第2层。。。,最多也就有个-1或者-2层,并没有说0层等等。

  • 于是,生活中这些从1开始计数的方式顺理成章的就会让我们形成一种凡事都从1开始的惯性思维,而当我们开始学习C编程却发现数组、计数等等都是从0开始的,最开始还不怎么习惯,硬着头皮久而久之也就适应了。

  • 其实生活中也是存在非常多从0开始标识的变量,比如下面的尺子,其测量长度就是从0开始的,同样时钟也是从零开始计时。

  • 于是大体可以找到一丝共性,从0开始的标识方式大部分都是为了表征一种距离和偏移量,而从1开始标识则是为了表征个体数量等等。

2

简化运算与编译器

  • 此观点应该是大部分教科书所表达的,C语言的精髓当然属于指针了,而指针的索引采用的就是一种偏移的概念。

  • 比如我们经常使用的ptr + 4 的地址为: ptr_Addr + 4*sizeof(type),当使用指针去索引数组Array[10],则用ptr指向数组头Array,理所当然*(ptr + 4) = Array[4];也可表示为 Array + 4*sizeof(type),从而指针的偏移刚好等于数组下标。

  • 如果Array数组从1开始标识*(ptr + 4) = Array[5];这样一方面不便于我们代码上理解,很容易忘记+1或者-1;另外一方面对于编译器解析代码还需要进行-1操作,势必会加长编译时间。

  • 所以Array从0开始标识也是为了与指针的偏移概念对齐,可以说数组下标表征的就是偏移量,而非标识的第一个元素!

3

终极底层思想

  • 除了C语言,现在大部分编程语言都是用0开始标识数组,比如C++,JAVA等等,这些相对后起的语言大多是为了延续着C的风格和习惯,或者是借鉴C的优点,这样一方面便于程序员更加自然的在多种编程语言中分析解决问题,另一方面为多种语言之间的相互调用、融合也会带来便利。

  • 不过如果仅仅只是一种迁就那终将被时代所抛弃,回首看看有多少编程语言在程序员的指尖溜走,而C现在都四五十岁了,仍然保持着活力,对于数组从0开始标识当然也是容不得半点马虎的。

  • C语言的特色在于它可以灵活的控制底层硬件却又保持着高级语言的易用和易懂属性,所以它算是一门非常接近底层硬件的语言。

  • 然而芯片可供程序员的控制操作大部分都是数字电路的组合,那么0/1电平,定时器的计数、系统寄存器、存储器的初始化状态值等等,均为0开始编码,既然C作为一门与底层非常亲近的语言,能够对硬件进行一种数据的抽象是一个非常自然的设计,这样就可以避免非常多用1开始标识而需要重新对齐的问题。

bug菌,第三点我真的太赞同了!

我仿佛又吹了一波C语言的牛!

3、结束语

做为一名多年的C爱好者,以上就是个人对该问题的一些理解了,最终答案还是由C语言考古队来发表吧。

好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地,如果你喜欢交流可以添加下方bug菌微信,我拉你加入公众号技术交流群。

推荐好文  点击蓝色字体即可跳转

☞【开源】bug菌把"动态数字显示"开源了!

☞【MCU】可怕,别人把我MCU固件给反汇编了!(逆向)

☞ 【程序人生】学不到东西,不想呆在这家公司了!

☞ 【C进阶】"最常见"却又"最不常用"的三个预编译

c++ 不能分配给为0的数组_【嵌入式C】你有想过quot;数组下标quot;为何从0开始吗?...相关推荐

  1. sql server 数组_如何在SQL Server中实现类似数组的功能

    sql server 数组 介绍 (Introduction) I was training some Oracle DBAs in T-SQL and they asked me how to cr ...

  2. android java 数组_关于android:Java按月将数组排列成多个数组

    我在Java中有一个包含一组随机日期的数组: { January 20 2015, February 12 2015, February 20 2015, June 21 2015, July 12 ...

  3. 多个数字数组_三菱ST语言教学(2)——数组的使用

    上一篇文章介绍了ST基本指令的用法,和声明基本数据类型的标签,但标签除了可以声明单个的基本数据,还可以声明多个数据构成的数组(array),也可以声明结构体(struct)和功能块(function ...

  4. vue 数组中嵌套数组_来,一起聊聊Excel中的数组

    有人说数组是Excel函数的精华,也有人说数组是Excel函数的糟粕,男说男有理女说女有爱,各有各的理由--所以王源说世间没有真正的感同身受.但不管怎么说吧,数组作为Excel函数进阶后的知识,是相当 ...

  5. java字符串拆分成数组_用Java实现JVM第八章《数组和字符串》

    小傅哥 | https://bugstack.cn 沉淀.分享.成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获.目前已完成的专题有:Netty4.x实战专题案例.用J ...

  6. c++ new 数组_用Java实现JVM第八章《数组和字符串》

    案例介绍 本章主要介绍如何实现让虚拟机处理数组和字符串,在虚拟机功能增强后,我们可以执行数组类型计算和输出字符串.本章需要新增实现数组指令:newarray.anewarray.arraylength ...

  7. this.$set 更新整个数组_学点算法(二)——有序数组二分搜索算法

    成功与失败 今天来学习一下二分搜索算法.二分搜索算法针对有序数组,如果数组乱序,则无法使用二分搜索法. 先来看一下二分搜索算法的运行原理: 判断区间是否有效,无效区间则退出循环. 取待查找区间的中间位 ...

  8. python生成一个数组_在for循环中创建多个数组(Python)

    我目前遇到Numpy阵列的问题.如果在其他地方已经提出这个问题,我道歉,但我觉得我到处都是. 我最初的问题是我试图创建一个数组并用多组不同大小的站数据填充它.由于我无法使用大小不同的数据集填充相同的数 ...

  9. object转换为数组_从V8源码分析一个JS 数组的内存占用问题

    前段时间,在排查一个问题的时候,遇到了一个有点令人困惑的情况,有下面这两段代码: const a = new Array(99999);a[99998] = undefined; const b = ...

  10. java获取字节数组_从java中的ByteBuffer获取字节数组

    问题 这是从ByteBuffer获取字节的推荐方法 ByteBuffer bb =.. byte[] b = new byte[bb.remaining()] bb.get(b, 0, b.lengt ...

最新文章

  1. Zeppelin:用于区块链应用的开源安全智能合约架构
  2. C语言实例:将人员信息写入磁盘文件并读出显示
  3. 重磅!《Android 全埋点技术白皮书》开源所有项目源码!
  4. mysql5.6错误代码
  5. c# 利用AForge和百度AI开发实时人脸识别
  6. 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计
  7. java封装原则_跟我学java编程—理解Java面向对象的封装原则
  8. 前端架构设计1:代码核心
  9. Linux之ssh-agent命令
  10. 新版标准日本语中级_第八课
  11. 利用scrapy爬取句子迷网站优美句子存储到本地(喜欢摘抄的人有福了!)
  12. win10如何打开本地组策略编辑器
  13. 常微分方程求解器ODE solver
  14. Unity3D求向量间的夹角
  15. Java开发面试基础,cmd启动mysql服务显示服务名无效
  16. 计算机电路基础综合题,计算机电路基础作业考试习题.doc
  17. oracle中ip带转数字,【PL/SQL】IP与数字互转
  18. 一文彻底了解Hive
  19. 屏幕复制 android,一键扫出截图中文字!屏幕文字复制App
  20. 四款最火在线作业APP深度测评

热门文章

  1. bootstrap select2 php,JS组件Bootstrap Select2使用方法详解
  2. mysql怎么修改表中的文字_mysql表中怎么修改字段?
  3. C#中IEnumerableT.Aggregate()的简单使用
  4. 沈阳职业计算机学院宿舍几人间,沈阳工学院宿舍怎么样 住宿条件好不好
  5. python读取数据库数据类型_Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】...
  6. js datagrid新增一行_Django接口新增页面编写_2(十五)
  7. linux 大数字 进制转换,Linux下用bc快速进行数字进制转换
  8. 2345王牌浏览器网页加载慢怎么办 网页加载慢解决
  9. Win11任务栏怎么隐藏
  10. mysql集群_MySQL集群