作者 | 漫话编程

来源 | 漫话编程(ID:mhcoding)

当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式:

for (int i=0; i<10; i++){}

可以看到,为了保证循环10次,我们定义了一个整数变量从0开始,然后循环10次,结束条件是i < 10。

其实这个本质就是使用了0 ≤ i < 10这种表达形式。

之所以很多人都这么写,有一个最主要的原因就是刚开始学编程的时候,老师都是这么教的…

关于这个问题,其实还有一位伟大的数学家曾经讨论过他的合理性。

这个人就是Dijkstra,他也是离散数学中应用广泛的最短路径算法的提出者,并且还提出了银行家算法。

他在1982年发表了一篇说明《Why numbering should start at zero》,这里面有部分内容阐述了这个观点。

他首先提出一个问题,让我们通过一个条件表达式表示 2,3,4,5,6,7,8,9,10,11,12 这11个数字,其实一般有以下四种写法:

  • a) 2 ≤ i < 13

  • b) 1 < i ≤ 12

  • c) 2 ≤ i ≤ 12

  • d) 1 < i < 13

这几种也是我们在写for循环的时候可能会用到的一些表示式,那着四种写法有没有好坏之分呢?

答案是有的。

我们其实可以观察到,a) 和 b)有个优点,上下边界的相减得到的差,正好等于子序列的长度,即13-2 = 12-1 = 11; 这样的写法可以让我们快速知道这个表示表达式中一共包含多少个自然数。

当然,这并不是正菜,只是开胃而已…

接下来,Dijkstra分别从表达式的上下界讨论了到底使用≤还是<更合理。

首先,他论证了一下表达式的下界使用哪种形式合理。

他认为,当我们想要表达自然数2-12的时候,如果使用1 < i作为这个序列的下界的话,这个下界的起始值进入了非自然数的区域。而使用2 ≤ i,那么就可以严格的保证这个下界就是一个自然数2 。所以,他认为下界使用≤更加合理。

符合这种形式的就是a) 和 c)两种。

那么a) 和 c)还有一个区别,就是上界一个用了≤一个用了<,那该使用哪种方式更加合适呢?

Dijkstra提出,如果想要表达一个空序列,使用a) 形式可以很容易的表达,如 0<= i <0就可以表示一个空序列。

但是如果上界和下界都用<= 就无法表示了,除非用1 <= i <= 0,但是这种形式就很不合逻辑。

所以,综上,他认为a) 2 ≤ i < 13 这种表达方式更加合理一些。

也就是说,使用左闭右开的形式定义表达式合理也更加优雅!

参考资料:

http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

关于作者:漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。

更多精彩推荐
☞他被称为"中国第一程序员",一人之力单挑微软,如今拜入武当修道
☞超可爱,抖音爆款实时视频漫画变身特效技术
☞罗永浩回应被中消协点名;传前淘宝直播运营负责人因贪污被阿里通报;TypeScript 4.0 Beta发布 | 极客头条
☞汉芯一号、木兰语言再到天赐OS,国产基础软件十年泣血,梦想何圆?
☞CPU 明明 8 个核,网卡为啥拼命折腾一号核?
☞4 张图读懂比特币矿商8年兴衰与变迁
你点的每个“在看”,我都认真当成了喜欢

漫画:为什么程序员喜欢使用 0 ≤ i 10 左闭右开形式写 for 循环?相关推荐

  1. 漫话:为什么程序员喜欢使用0 ≤ i 10这种左闭右开的形式写for循环?

    当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式: for (int i=0; i<10; i++){} 可以看到,为了保证循环10次,我们定义了一个整数变量从0开始,然后循环1 ...

  2. python左闭右开_漫话:为什么程序员喜欢使用0 ≤ i 10这种左闭右开的形式写for循环?...

    当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式: for (int i=0; i<10; i++){ } 可以看到,为了保证循环10次,我们定义了一个整数变量从0开始,然后循环 ...

  3. 漫画:程序员每天的6场战斗

    Mart Virkus@toggl.com 读完需要 5 分钟 速读仅需 2 分钟 作者丨Will Oremus 译者丨大白 策划丨中生代技术社区 程序员的生活很难! 我并不是说其他工作很容易.但程序 ...

  4. 漫画:程序员和产品经理撕得真是太太太太厉害了

    虾脑湿 iamyourgrandpa 读完需要 1 分钟 速读仅需 1 分钟 程序员和产品经理有解不开的仇恨,就像杰瑞碰见汤姆. 这思维代沟还要从"产品经理让程序员买包中华"这个需 ...

  5. 10月16日云栖精选夜读 | 为什么程序员喜欢在半夜写代码?

    本文的作者是 Swizec Teller,他是一名自由职业者兼连续创业家,有超过17 年以上的软件开发经验,自称 A Geek with a Hat.几年前因为在inside.com上发了一篇文章&l ...

  6. chrome java插件_Java程序员喜欢的10款软件里有你在用的吗?

    作为一名Java程序员,日常开发的过程中,我们需要借助很多工具来进行编码.好的工具可以极大的提升程序员的工作效率,今天我们来认识下大多数程序员喜欢的10款软件.持不同意见或有想要补充的小伙伴,欢迎评论 ...

  7. 漫画:程序员战力图鉴

    戳蓝字"CSDN云计算"关注我们哦! 看漫画了解程序员战斗力 are u ready? 编程架构能力 撕比嘴炮能力 划水摸鱼能力 花式甩锅能力 画饼忽悠能力 PPT吹比能力 哈哈哈 ...

  8. 如何让程序员喜欢上编码

     如何让程序员喜欢上编码 奇葩图片网(www.78tp.com) 多少人是因为兴趣而选择编码的,既然做程序员,为什么不选择喜欢编码呢?商业内幕最近发表了一篇文章说做程序员压力山大,很多人都快疯了. ...

  9. 漫画:程序员之间的真爱,好暖啊!

    漫画转载自公众号  程序员最幽默 @IT程序猿 微博网友评论: @抠Bee:看了好一会才知道是个假发 @昵称Liang:别这样,以后就都这样认为了 @廖宇星灬:是程序员没错了. @yao伪未来奋斗:最 ...

最新文章

  1. 【错误记录】Android 分区存储下的 SD 卡应用专属外部存储空间目录访问 ( 需手动创建应用专属外部存储空间目录 )
  2. Ubuntu 12.10下配置Web服务器详细教程
  3. 使用SMW0上传EXCEL模板遇到的问题
  4. InfluxData【环境搭建 02】时序数据库客户端 InfluxCLI 最新版本安装启动验证(在线安装+离线安装及各版本下载地址)
  5. [攻防世界 pwn]——string(内涵peak小知识)
  6. 哨兵机制服务器环境准备
  7. 设置固定长度_加气块砌筑(构造柱、圈梁设置)技术交底21条
  8. 汇编语言:汇编程序的hello world程序(实验9根据材料编程)
  9. 很想去摆地摊,可是不知道怎么开始,前期需要做什么准备工作吗?
  10. plsql 存储过程 批量提交_新一代的键值存储 KVell SOSP 2019
  11. 未来教育计算机二级python_计算机二级题库
  12. 计算机应用数学,计算机应用数学.PDF
  13. 手机4g接台式计算机,我用4G手机开热点连接电脑网速很慢怎么回事
  14. matlab饼状图的编程方法,matlab饼状图
  15. 今日春分|春生美好,万事可期
  16. 【转】Fluent学习笔记(10)-----多相流模型
  17. 超详细快速入门JavaScript详解(一)
  18. 【Python打卡2019】20190417之计算BMR
  19. AndroidManifest配置文件介绍
  20. 元宵爬虫-YuanXiaoSpider

热门文章

  1. 【最强ResNet改进系列】IResNet:涨点不涨计算量,可训练网络超过3000层!
  2. php fpm是干嘛的,php-fpm是什么?
  3. SAP QM Quality Notification的凭证流
  4. 李世石宣布退役,高呼AI不可战胜:将举行史上首次让子人机大战
  5. 陆奇:不确定的世界需要更多对话,人工智能需要人监督
  6. 动手学深度学习需要这些数学基础知识
  7. 基于飞桨PaddlePaddle的语义角色标注任务全解析
  8. 谁说只有VGG才能做风格迁移,ResNet也可以!答案就在对抗攻击中
  9. 解读 | Arm 机器学习处理器的独特之处
  10. 预言丨AI之后无AI