关于c中的for循环边界的设置
2015-12-16 12:47
246 查看
关于for循环边界的设置
for循环是一个非常常用的循环语句,比如我们有这么一个循环语句:for(int i=0;i<10;i++) {}
这是一个很标准的for循环语句,大家一般都是这么写的,不过为什么这么写呢?
这其中的缘由都由一个叫做“差一错误”的错误导致的,这个错误也可以这么说,“栏杆错误”。下面我们来举个例子:
假如我们有这么一个需求,在100英尺长的边界,每隔10英尺就插一个栏杆,那么我们总共需要多少栏杆呢?
我相信大部分人在经过1-2秒的思考后都会脱口而出:必须11个嘛,事实也确实如此,但是在我们写代码的时候,很容易就通过100/10=10来得到10个栏杆了,不要觉得这很弱智,在不经意间你可能就犯了这个错误,而且频率估计还不低。
但是此文是想解释我们的for循环语句的边界为什么这么写,所以回到正题来,我们提出这么一个例子:
15<=x<=30;
这其中有多少个数呢?
我们先考虑最简单的情况,先假设x的上界和下界相同,既有:
15<=x,x>=15;
从中我们可以看出,在上下边界一致的情况下,这其中只有一个数,再来考虑一般的情况,假定下界为1,上界为h,那么有,上下界相同的话,有:
h=1->h-1=0;
上下界之差为0,但是此时我们的数字有一个,所以+1,此时有:
h-1+1; //为1到h的数字数
那么这时我们再来解决这么一个问题:
15<=x<=37;//这之间有多少个数字呢?
这就简单了:37-15+1=23啊。
说到这儿,大家心里也差不多知道了,在for循环中,若果我们这么去设置:
for(int i=3,i<=10,i++){}
这么做的话,与我们的原意相违背,我们想要取的是7个数字而已,不过现在我们却取出了10-3+1=8个数字!我们会发现若是采取对称,两边都取”=“的写法的话,我们总是会多出一个数。
所以我们都是这么写的:
for(int i=3;i<10;i++){}
这么写的话,我们就取出了10-3+1-1=7个数字了!
我们之所以这么写是因为有上面的推论,不过有人会有疑问,为什么不这么写呢:
for(int i=3;i<=9;i++){}
我的回答是这样写是没有错误的,不过这么写的话,不能很好地表现出for循环的入界点(包含边界)和出界点(不包含边界),不够直观。
其实for循环的条件最好就是这样不对称的写出它的入界点和出界点,不会犯错的同时也比较直观的看出数据。
这一部分不对称边界的知识点还有很多其他的妙用,感兴趣的朋友可以阅读《c陷阱与缺陷》这本书。
本文只是想解释for标准写法中边界的原由。
相关文章推荐
- ID,instancetype与__kindof
- Rxlifecycle(二):源码解析
- SpannableString用法
- redis高级特性之持久化
- UINavigationBar Background Color
- 记录Sqlserver2012附加Sqlserver2008的数据库出错的解决方案
- opendir、readdir、rewinddir、closedir、telldir、seekdir、stat函数和DIR、dirent、stat结构体详解
- 数组遍历时遇到的小Bug
- Linux多线程实践(一)线程基本概念和理论
- 真机调试问题
- linux安装软件lnmp
- 如何成为牛逼的程序员
- 一个fork的面试题
- fastclick导致的iphone中select点击闪退的bug
- [POJ1961] Period/[NKOI2201] 周期
- AWK 简明教程
- sed 简明教程
- codeblock 使用C++11 相关细节
- linux下jdk_tomcat+mysql配置那点事
- BZOJ3620: 似乎在梦中见过的样子