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

【产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数】
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
当我们想要写一个循环体 , 期望执行10次的时候 , 我们会使用以下方式:
for(inti=0i&lt10i++){
}
可以看到 , 为了保证循环10次 , 我们定义了一个整数变量从0开始 。
还有 , 当我们定义数组的时候 , 在常见的C语言、Java、Python等语言中 , 都是使用下标0来表示第一个元素的 。
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
从0开始更优雅
在一文中我们分析过 , Dijkstra通过分析 , 得出在进行范围表达的时候 , 使用左闭右开的方式更加合理 。
但是 , Dijkstra在分析出2≤i&lt13这种形式更加合理之后 , 他有陷入了另外一个思考 , 那就是:
当处理长度为N的序列时 , 到底第一个元素的下标使用0还是1更加合适?
关于这个分析 , 他的出发点很简单 , 那就是哪种方式更加漂亮 , 更加优雅 。
他认为 , 使用左闭右开的表达方式 , 当下标从1开始时 , 下标范围为1&lt=i&ltN+1;当下标从0开始时则是0&lt=i&ltN;
而显然后面这种表达式更加漂亮、优雅一些 。 所以 , 他建议我们使用0作为第一个下标 。
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
计数表示偏移量
很多人学习编程都是从C语言开始的 , 那么 , C语言就是一个典型的0-base语言(以0作为计数的开始) , 其实 , 这一约定早在BCPL时代就是这样的了 。
在C语言还不叫C语言 , 还叫BCPL的时候 , 他的作者马丁·理察德就设计了数组从0开始的索引方式 。
当我们在BCPL(C语言)中定义数组intarr[8]的时候 , 编辑器会在内存中开辟一块空间(这个空间中可能包含多个内存单元)供该数组使用 。
为了能让数组找到编译器为自己开辟的空间 , 会把这块内存空间中第一个内存单元的地址(0X0000001)赋值给这个数组 , 当我们使用&amparr的时候 , 就可以拿到这块地址 。
产业气象站|而不是从1开始?,漫话:如何给女朋友解释为什么计算机从0开始计数
文章图片
BCPL最初是用IBM7094机器编译的;它在编译时会优化这些数组索引提供的指针反参考运算(indirection) , 即可以通过指针取出地址中存储的值 , 这个特性也一直延续到今天 。


推荐阅读