当我们想要写一个循环体,期望执行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

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

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

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

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

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

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

    作者 | 漫话编程 来源 | 漫话编程(ID:mhcoding) 当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式: for (int i=0; i<10; i++){} 可以看 ...

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

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

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

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

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

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

  6. 测试/开发程序员喜欢跳槽?跳了就能涨工资吗?

    目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...

  7. 为什么中国的程序员喜欢用英文写代码,甚至注释也用英文?

    为什么中国的程序员喜欢用英文写代码,甚至注释也用英文? 1.因为英语是国际通用的,用英语方便各国程序员. 2.因为英文才专业 3.因为语句只能用英文 4.因为变量名用英文方便外国同行看代码 5.因为英 ...

  8. 为什么程序员喜欢深更半夜写代码

    程序员自己也常说,工作效率最高的时候总是在深夜,不是凌晨还在写代码就是凌晨爬起来写代码. 深夜之所以工作效率高是因为不易分心,额!其实仔细想想晚上和白天并无多大区别,但程序员们也总是有自己的理由,大致 ...

  9. 学习笔记:黑马程序员C++从0到1(3~4)

    黑马程序员C++从0到1入门编程 3 运算符 3.1 算术运算符 3.2 赋值运算符 3.3 比较运算符 3.4 逻辑运算符 4 程序流程结构 4.1 选择结构 4.1.1 If 语句 4.1.1.1 ...

最新文章

  1. 微信小程序的省市区三级地址mysql_微信小程序picker实现的省市区三级联动
  2. 十年沉淀、厚积薄发,百度CTO王海峰秀出NLP十年成果
  3. 小程序页面跳转传参参数值为url时参数时 会出现丢失
  4. python【力扣LeetCode算法题库】3- 无重复字符的最长子串
  5. linux系统增加swap分区
  6. amd一键超频怎么用_头条信息流“一键起量”工具怎么用?经验分享
  7. Django从理论到实战(part37)--关于迁移
  8. java+character类使用_Java Character类应用实例
  9. Java设计模式 - 示例教程
  10. 一文看懂网络上采样层中的 align_corners
  11. Android权限详解
  12. Windows Server 2008 R2 install Visual Studio 2015 failed
  13. 新华字典mysql_数据库优化篇---MySql索引优化详解
  14. 计算有向图可达矩阵Matlab实现
  15. 拆解一个老式电感电容表
  16. 英语一窍不通能学计算机吗,英语一窍不通能学好软件么
  17. OpenCV蒙版的使用实例(1)
  18. 倾向值匹配法的概述和应用+倾向值分析:统计方法与应用
  19. CSP 2018-9-4 再卖菜 搜索 + 剪枝
  20. 微信订阅推送通知实现

热门文章

  1. Postman Forbidden (CSRF token missing or incorrect.)
  2. php 规则配置,模块Config配置规则
  3. cef 前进后台 实现_CefSpider: 一个基于Webkit,Cef框架构建爬虫,项目代号:“车风”,具备浏览器所有特性,欢迎你给我一个Star,你的Star是该项目前进的动力!...
  4. android shape画边框,安卓用shape画圆角矩形边框
  5. 计组之总线:2、总线仲裁(链式查询、计数器查询、独立请求、分布式查询)
  6. 数据结构之插入排序:希尔排序(缩小增量排序)
  7. Linux系统编程40:多线程之基于环形队列的生产者与消费者模型
  8. 应用netstat查看目标机TCP连接的状况
  9. Tcpdump个人实战总结
  10. 反应堆模式(reactor)