中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?


中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图
中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图
中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图
中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图
中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图
中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图

当我们想要写一个循环体 , 期望执行10次的时候 , 我们会使用以下方式:
for (int i=0 i&lt10 i++){
}
可以看到 , 为了保证循环10次 , 我们定义了一个整数变量从0开始 。
还有 , 当我们定义数组的时候 , 在常见的C语言、Java、Python等语言中 , 都是使用下标0来表示第一个元素的 。
中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图

中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图
【中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?】
中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图

中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图

从0开始更优雅
在一文中我们分析过 , Dijkstra通过分析 , 得出在进行范围表达的时候 , 使用左闭右开的方式更加合理 。
但是 , Dijkstra在分析出2 ≤ i &lt 13这种形式更加合理之后 , 他有陷入了另外一个思考 , 那就是:

当处理长度为 N 的序列时 , 到底第一个元素的下标使用0还是1更加合适?
关于这个分析 , 他的出发点很简单 , 那就是哪种方式更加漂亮 , 更加优雅 。
他认为 , 使用左闭右开的表达方式 , 当下标从 1 开始时 , 下标范围为 1 &lt= i &lt N+1;当下标从 0 开始时则是 0 &lt= i &lt N;
而显然后面这种表达式更加漂亮、优雅一些 。 所以 , 他建议我们使用0作为第一个下标 。
中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图

中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图

中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图

中年|漫话:如何给女朋友解释为什么计算机从0开始计数,而不是从1开始?
本文插图

计数表示偏移量
很多人学习编程都是从C语言开始的 , 那么 , C语言就是一个典型的0-base语言(以0作为计数的开始) , 其实 , 这一约定早在BCPL时代就是这样的了 。
在C语言还不叫C语言 , 还叫BCPL的时候 , 他的作者马丁·理察德就设计了数组从0开始的索引方式 。
当我们在BCPL(C语言)中定义数组int arr[8]的时候 , 编辑器会在内存中开辟一块空间(这个空间中可能包含多个内存单元)供该数组使用 。

为了能让数组找到编译器为自己开辟的空间 , 会把这块内存空间中第一个内存单元的地址(0X0000001)赋值给这个数组 , 当我们使用&amparr的时候 , 就可以拿到这块地址 。


推荐阅读