中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图
本文插图
本文插图
本文插图
本文插图
本文插图
当我们想要写一个循环体 , 期望执行10次的时候 , 我们会使用以下方式:
for (int i=0 i<10 i++){
}
可以看到 , 为了保证循环10次 , 我们定义了一个整数变量从0开始 。
还有 , 当我们定义数组的时候 , 在常见的C语言、Java、Python等语言中 , 都是使用下标0来表示第一个元素的 。
本文插图
本文插图
【中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?】
本文插图
本文插图
从0开始更优雅
在一文中我们分析过 , Dijkstra通过分析 , 得出在进行范围表达的时候 , 使用左闭右开的方式更加合理 。
但是 , Dijkstra在分析出2 ≤ i < 13这种形式更加合理之后 , 他有陷入了另外一个思考 , 那就是:
当处理长度为 N 的序列时 , 到底第一个元素的下标使用0还是1更加合适?
关于这个分析 , 他的出发点很简单 , 那就是哪种方式更加漂亮 , 更加优雅 。
他认为 , 使用左闭右开的表达方式 , 当下标从 1 开始时 , 下标范围为 1 <= i < N+1;当下标从 0 开始时则是 0 <= i < N;
而显然后面这种表达式更加漂亮、优雅一些 。 所以 , 他建议我们使用0作为第一个下标 。
本文插图
本文插图
本文插图
本文插图
计数表示偏移量
很多人学习编程都是从C语言开始的 , 那么 , C语言就是一个典型的0-base语言(以0作为计数的开始) , 其实 , 这一约定早在BCPL时代就是这样的了 。
在C语言还不叫C语言 , 还叫BCPL的时候 , 他的作者马丁·理察德就设计了数组从0开始的索引方式 。
当我们在BCPL(C语言)中定义数组int arr[8]的时候 , 编辑器会在内存中开辟一块空间(这个空间中可能包含多个内存单元)供该数组使用 。
为了能让数组找到编译器为自己开辟的空间 , 会把这块内存空间中第一个内存单元的地址(0X0000001)赋值给这个数组 , 当我们使用&arr的时候 , 就可以拿到这块地址 。
推荐阅读
- Spacex|卫星互联网轨道资源稀缺,中国航天如何与国际卫星界大亨竞争?
- 中年|北斗“一张网”可实现全天候、高精度、自主可控服务
- 中年|Python编程语言有什么独特的优势呢?
- 中年|谈一谈我的十年机械工作经历
- 中年|弹无虚发的背后,国产弹药质量把关人,精密机床都要自叹不如
- iQOO手机|毕业想换5G手机不知如何选?别犹豫了,iQOO Z1x适合你
- 中年|宿迁深圳招商再结硕果,签约项目19个,协议总投资158亿元
- 蓝橡树|牛娃爸爸分享: 孩子如何通过学习编程, 激活大脑, 提升成绩, 逆袭名校?
- 中年|苹果:已终止Epic Games开发者账号
- 中年|圆满的结局!苹果微信之间不用再二选一,美国政府还是做出让步
