漫话:为什么程序员喜欢使用0 ≤ i < 10这种左闭右开的形式写for循环?
![](http://static.careerengine.us/api/aov2/http%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVtNsXazib4a1LhDoDooFwTqhVzDnxymswN9uicvmU0AvQia5E3sBKYoYuw_%7C_0%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_mQlO20PgUDKtONJc69QACFgicXyIDlBh63BR1GkoakiaIeOyqE65A4KP4neMfV1RYqlcXqbxSfEcMSAbDRJ3jXxA_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRV2VCTArLsFbJHCrPt1wDJsAicdIVvlr962CDuDCQdaJanW2UAicIz3FGw_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVlAwXaH0gEpZaelHdiceQmD4icibBMoVHpbaD6Ir7uMxoiaN0Buhk1mzumQ_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVxt3e4pNaBYbiaYNh0l9PtTWxiah2yOCcVbfPcEFz1jCl06AxYGPtaicKQ_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVrIudRHNl6PicO6zwgt0RicibCcf3icKgpzTSDUibgyfXibaaWEfM8gpJVQJg_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRV2dgIB0bYcTmibiclprXIxNvWavXfAAu01tMyAnDbNBibq9ShtiaeMUaPlA_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVdNnkk1ZuMlfJCTffBVPZMj9rW4D7jic4RPicObHLbZ1Ivfv9Zul1ibs8A_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVAibAOxLowdxeicLUrOibSbT0A6JIQHNx8r1Qzd11l4Zncc50Sm7ciayraA_%7C_640%3Fwx_fmt%3Djpeg.jpg)
当我们想要写一个循环体,期望执行10次的时候,我们会使用以下方式:
for (int i=0; i<10; i++){
}
可以看到,为了保证循环10次,我们定义了一个整数变量从0开始,然后循环10次,结束条件是i < 10。
其实这个本质就是使用了
0 ≤ i < 10
这种表达形式。之所以很多人都这么写,有一个最主要的原因就是刚开始学编程的时候,老师都是这么教的…
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVv7icSaiccXib96lqic5xovbytIBxrHGWsWctG28B1A8eib7P9pdmU2zwOKA_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVAib9fs3GDRUHMbGVmSx0yefz7PeOVfkQNkFbzT63SNjITpAPzgVeNzA_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVAXlyjqSHSTQOXWP8fDahZgld0kZYZoVwMdcic8ia6zyf0yBkeHJ189KA_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVhNaGhh7vV9PC0qPsZnjxXsMiczANbLptK1S57kgRj6vp5mab1GyTRMA_%7C_640%3Fwx_fmt%3Djpeg.jpg)
关于这个问题,其实还有一位伟大的数学家曾经讨论过他的合理性。
这个人就是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循环的时候可能会用到的一些表示式,那着四种写法有没有好坏之分呢?
答案是有的。
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVXicl7DywmlrsoSP1OJZMfCM6eFcyvgXwfYt2g4BqIE5F9Dgc4nibQGyw_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVhzVyIIBXenBticjpHaIjAzhhHSxEsia2INt0Nk9E4Bic7PZmmfnusnp5A_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVg9HlCXibQIicCJIdtiaoNeXUBQaMM0Pjq5fNC53e0iazMdWpfJCicukicSmQ_%7C_640%3Fwx_fmt%3Djpeg.jpg)
我们其实可以观察到,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://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVQqGN1g2ibv0oNA9t4FFvwtIibteicrAjtuHeVC290QHDyiawf66NXkDiaLA_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRV0ciaS91ZujUgZIvkPdWU4mibJfxibkAhymllIya6KFicK2y1ickCNP9XTSg_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18HgLTheMFNsiaDy7fc4IGRVicrxOm3Sl2JibfwzvKibfIfBzV3JgAeBjdNpvs9CbpAhehGQfNqOKaj5g_%7C_640%3Fwx_fmt%3Djpeg.jpg)
参考资料:
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
关于作者:漫话编程,是一个通过漫画+音频的形式讲解枯燥的编程知识的公众号。致力于让编程变得更有乐趣。
推荐阅读:
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_C1uDMDqjn1ibHbCU2uStzgickicPVx8dTvXsJx0bSBicMffyV0l2A9ZhFLJ6yNf4sydFpfCw8hVpsv9A3JNY0yYibfA_%7C_640%3Fwx_fmt%3Dpng.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_png_%7C_C1uDMDqjn1ibHbCU2uStzgickicPVx8dTvXsJx0bSBicMffyV0l2A9ZhFLJ6yNf4sydFpfCw8hVpsv9A3JNY0yYibfA_%7C_640%3Fwx_fmt%3Dpng.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn1ibHbCU2uStzgickicPVx8dTvXD3xBw8gjLD3G1dwCPXfbkpUrYaWHlzBDMGGpVvueiaaAYtAEEkcQicHw_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_jpg_%7C_C1uDMDqjn18LPQfZkBTzR42LiapBhhiaUxHBbrQnlkxzZqZGfgiaq4G7gHadvQibhVqGpeYMNcc9KkdVLibKia2XJHkg_%7C_640%3Fwx_fmt%3Djpeg.jpg)
![](http://static.careerengine.us/api/aov2/https%3A_%7C__%7C_mmbiz.qpic.cn_%7C_mmbiz_gif_%7C_7QRTvkK2qC6sLlAPcPheDLycujYrOvsZviaSODbRbQzQvW8VL1yiaGA8FTPbpObFuJibSdib3T55sJOa3QfVCyiaPcA_%7C_640%3Fwx_fmt%3Dgif.jpg)
关键词
表达式
就是
问题
时候
程序员
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。