当前位置: 首页 > news >正文

广州中小学安全教育平台企业整站优化

广州中小学安全教育平台,企业整站优化,沧州百度爱采购,百度云建站网站建设#干了这碗鸡汤我越来越相信,创造美好的代价是:努力、失望以及毅力。首先是疼痛,然后才是欢乐。-- 梵高众所周知,计算机是从0开始计数,而不是我们平时常用的从1开始计数,但你有想过为什么吗?其实…

#干了这碗鸡汤

我越来越相信,创造美好的代价是:努力、失望以及毅力。首先是疼痛,然后才是欢乐。

-- 梵高

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

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

这个问题超纲了,程序喵不会,但是本着对科学的敬畏之心,经过大量的搜索查证,我终于找到了答案。

故事还要从一位真正的大佬

艾兹格·迪科斯彻(Dijkstra)

讲起,

艾兹格·W·迪科斯彻Dijkstra结构程序设计之父

提出“goto有害论”;

提出信号量和PV原语;

解决了“哲学家聚餐”问题;

Dijkstra最短路径算法和银行家算法的创造者;

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

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

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

这里贴出我翻译后的大佬语录:为了表示自然数1,2,3,4...14...的子序列,一般有四种序列的表示方法:

a) 2 ≤i< 13

b) 1

c) 2 ≤i≤ 12

d) 1

以上的几种表达方式里,有哪一种比其他的好吗?

是的,

a

b

有较为明显的优点:他们上下界数值之间的差值就是这个序列的长度。在任何一种表示中,两个子序列相邻,最好是其中一个的上界等于另外一个的下界,但这还不能抉择出a和b方式哪种更好,继续分析;

假设序列里要包含最小的自然数,如果使用

b

d

这种方式,那下界就必须是个非自然数,这就不太好看了,所以这里更倾向于使用

a

c

的方式,即使用≤方式表示下界。这里如果使用≤表示上界,那一个空的子序列表示方式也将会很丑陋,所以对于上界,大佬的结论是更喜欢使用

a

d

中的

a

方式最终获胜,继续分析;

当需要表示一个长度为N的序列时,如果想通过下标来区分其中的元素,那又来了一个棘手的问题:

初始元素的下标值应该用多少呢

,如果从1开始,那范围变成1 ≤ i < N+1,如果从0开始,那范围会是0≤ i < N,显然后一种方式更优雅更直观,所以大佬最后的结论是自己更倾向于一个序列的表示最好从0开始。大佬语录总结

在进行范围表达的时候,使用左闭右开的方式更优雅,他思考过,在处理长度为N的序列时,到底第一个元素的下标使用0更合适还是使用1更合适?他的出发点很简单,那就是哪种方式更优雅。首先确定使用左闭右开的方式,当下标从1开始时,下标范围为1<=i

难道只有优雅这一个原因吗?其实下标从0开始主要的意义是表示偏移,下面举例:

数组为什么起始下标是0?其实数组是一种线性结构,它有一段连续的内存空间,存储一组具有相同类型的数据。

如图,拿一个长度为10的int类型数组举例,系统就会为该数据分配一段连续的内存空间,空间大小为40个字节,其中内存块首地址base_address = 100。

数组是可以随机访问的,当访问第i个元素时,需要定位第i个元素的地址,定位公式如下:

第i个元素地址=base_address + i * data_type_size

其中data_type_size表示数组中元素类型的大小,int类型大小是4字节,所以公式里data_type_size等于4。在这里,下标可以理解为偏移,数组的首地址就是base_address,其中a[0]就是偏移为0的位置,a[i]就是偏移了i个data_type_size大小的位置,所以计算a[i]地址的公式为:a[i]地址=base_address + i * data_type_size

这里如果数组下标从1开始,那么a[i]地址的公式为:

a[i]地址=base_address + (i - 1) * data_type_size

两个公式显而易见,下标从0开始的更加简单,后者从1开始,每次访问数组元素都需要额外做一次减法操作,效率更低。

我们知道在Python中数组也是将0作为起始下标,对此Python之父Guido van Rossum也给出过正面回答,下面贴出他的翻译后的语录:大佬语录

关于这个问题之前就有人在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开始计数了吗?

文中如果有翻译的不妥之处还请大家指正(可以私聊或在后台发给我),十分感谢!

参考资料

https://www.cs.utexas.edu/~EWD/transcriptions/EWD08xx/EWD831.html

https://blog.csdn.net/csdnsevenn/article/details/107421466

https://docle.github.io/2018/08/26/Why-Numbering-Should-Start-At-Zero/

https://www.reddit.com/r/Python/comments/1p2za1/guido_van_rossum_why_python_uses_0based_indexing/

http://www.lbrq.cn/news/2613601.html

相关文章:

  • 视频源网站怎么做优化方案的格式及范文
  • 做视频网站seo怎么赚钱
  • wordpress发号系统巢湖seo推广
  • 做ui必要的网站最新最好的磁力搜索
  • 汕头模板建站软件网站seo优化报告
  • 内蒙古住房建设厅网站百度问一问人工客服怎么联系
  • 西安网站建设网络网站域名查询地址
  • 哪类型网站容易做找网络公司做推广费用
  • 重庆永川网站建设价格网站策划方案
  • 怎样重新运行wordpress四川seo推广公司
  • 工程建设信息官方网站做app找什么公司
  • 尤溪网站开发seo交流qq群
  • 如何做网站平台关注站长之家域名查询官网
  • 搜狗网站入口百度seo发包工具
  • 2个网站 同意内容 百度优化百度seo排名公司
  • net做网站杭州seo网站建设靠谱
  • .net和php哪个做网站好网络营销的主要手段
  • 做企业网站前期需要准备什么网络推广宣传方式
  • 做网站 学php哪一部分网络营销的主要特点有哪些
  • 网站独立物流系统查指数
  • 做网站一般注册哪几类商标项目优化seo
  • 山东做网站建设的好公司成都网络营销搜索推广
  • 网站后台怎么上传文章百度文库个人登录
  • 京东网站建设及特点软件推广平台
  • 做网站的流程是怎么样的重庆seo优化
  • 怎么做自己网站产品seo百度建站
  • 天天向上做图网站企业类网站有哪些例子
  • 新浪云虚拟主机做电影网站西安小程序开发的公司
  • 网站建设运营期末考试seo常用的优化工具
  • 做淘宝客网站能有效果吗软文是什么
  • Android—服务+通知=>前台服务
  • 一种红外遥控RGB灯带控制器-最低价MCU
  • 脚手架开发-准备配置-配置文件的准备项目的一些中间件
  • 20250805问答课题-实现TextRank + 问题分类
  • 【论文简读】LongSplat
  • python常用数据类型