zoukankan      html  css  js  c++  java
  • 计算机为什么要从 0 开始计数?

    众所周知,计算机是从0开始计数,而不是我们平时常用的从1开始计数,但你有想过为什么吗?

    其实不是计算机从0开始计数而是多数编程语言中的数组都使用0作为起始下标,又是为什么呢?

    故事还要从一位真正的大佬艾兹格·迪科斯彻(Dijkstra)讲起,

    艾兹格·W·迪科斯彻Dijkstra结构程序设计之父
    提出“goto有害论”;
    提出信号量和PV原语;
    解决了“哲学家聚餐”问题;
    Dijkstra最短路径算法和银行家算法的创造者;

    THE操作系统的设计者和开发者;

    第一个Algol 60编译器的设计者和实现者;

    与D. E. Knuth并称为我们这个时代最伟大的计算机科学家的人。

    大佬语录

    关于这个问题之前就有人在Twitter上询问过我,我给出过回答。这个问题我思考过很久:ABC语言是Python的祖先之一,使用的索引就是从1开始的,而另一门对Python有重要影响的C语言,它的索引就是从0开始。之前的几门编程语言(Algol,Fortran, Pascal)有使用1作为起始索引的,有使用某个变量作为索引。而推动我使用0作为起始索引的原因之一就是切片语法。

    让我们先来看看切片的用例,可能关于切片最常见的用法就是“取前n个元素”和“取从i开始的后n个元素”,如果在使用这两种用法时不需要带有+1或者-1的补偿操作,那代码会很优雅。

    使用基于0的索引方式,那上面两种切片用法就会非常漂亮:a[:n]和a[i:i+n],前者是a[0:n]的缩写。

    使用基于1的索引方式,如果你想用a[:n]表示取前n个元素的意思,要么使用闭合区间切片语法,要么使用起始索引加切片长度作为参数的方法。半开区间切片方法如果和基于1的索引方式结合起来那代码将会变得不优雅。而如果使用闭合区间切片语法的话,为了从第i位索引开始取n个元素,那就需要把表达式写成a[i, i+n-1]。这样看来也许使用切片起始位+长度的方式在基于1的索引方法中更合适?这样你可以写成a[i:n],并且ABC语言就是这么做的,你可以写成a@i|n这种特别的语法。

    但是,index:length这种方式在其它情况下也适用吗?我有点记不清了,但我认为我确实是被半开区间这种优雅的语法迷住啦。特别是当两个切片操作相邻时,第一个切片的终点索引是第二个切片的起始索引时,这种语法简直太漂亮啦。例如你想要将一个字符串使用i和j分成三部分,这三部分会是a[:i],a[i:j]和a[j:],真是太漂亮啦。

    这就是为什么Python使用0作为起始索引的原因。

    看到这里你知道为什么很多编程语言都是从0开始计数了吗?

  • 相关阅读:
    修改ASP.NET MVC Ajax分页组件ASP.NET MvcPager一个小Bug并修该样式为自己所用(一)
    HighCharts报表 API
    自动化开发资料
    修改ASP.NET MVC Ajax分页组件ASP.NET MvcPager一个小Bug并修该样式为自己所用(三)
    网络营销资料收集
    C#扩展方法
    UI Automation Under the Hood (1)
    C#辅助类之ConfigHelper
    设计模式资源汇总
    Windows GUI自动化测试
  • 原文地址:https://www.cnblogs.com/shujuyr/p/14323808.html
Copyright © 2011-2022 走看看