您的位置:首页 > 其它

关于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标准写法中边界的原由。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: