Quartz's Blog

Change Impossible into I'm possible.

边界问题

边界计算是这样吗?

现在假想有一个数组有十个元素,那么其下标允许的范围是多少呢?
在C中,其下标是0~9的数
所以我们知道在n个元素的数组中,没有下标为n的元素,其下标为0~(n-1)

边界的困惑

int a[10];
for(int i=1; i <= 10; i++)
    a[i]=0;

这样的验证的结果,细细想想,必然是下标越界了,可是
一切又看起来这么合理

这是优势?

C语言的这种设计,也许会让大家在这里懵上一阵子,可是,
这种设计,恰恰是其最大的优势所在。下面我们慢慢讲解。

在很多的的程序设计错误中,“栏杆错误”是最难察觉的一种,就像上面的Code中的一样,看似那么合理,可是就是有越界这样的致命错误。

听题!
100米的路每2米一根栏杆,问要多少根,“显而易见”100/2=50,
当然他是错误的,实际上是51根。

这样思考的方法,最简单的应该是这样,除了右边的2米,其余每一个2米的左边总有一根栏杆,补上这最右边的一根,刚刚好就是51根

所以,在边界的问题中千万不能凭直觉。

又一个问题

如果一个数x,x>=10,x<=19,那么其中的整数有多少个呢?
很显然19-10=18(不过很遗憾,很接近)
可是这样到底是多少呢?17?18?19?

这样我们继续从头开始思考这个问题了
若是有一个数x>=15,x<=15那么x的值有多少个呢?当然你应该自信的大声呐喊 就是15!只有一个!
所以我们要记得,当上下边界重合时只有一个元素

所以现在我们适当外推,从1,到第n个数
那么实际上就是(n-1+1)个元素了,于是乎,所有的重点就在这个+1的上面了,
那么说了这么多,要是一直问这个问题提心吊胆,那这以后还怎么Code啊。

不对称的美丽

当我们把前面的例子改成这个样子呢,x>=10,x<19,这样上边界就没有在我们的范围内了,
问题就得到了竟然的简化
19-10=9 你可以自信的喊出答案了,
这中并不对称的例子,也是如此美丽的

C中的不对称

在C的数组里,元素的下标是从0开始的,这样的优势就是分明显啦

int array[10];
for(int i=0; i<10; i++ )    //  1
    a[i]=0;
for(int i=0; i<=9; i++ )    //  2
    a[i]=0;

上面两个for都是遍历数组进行了初始化的,现在是不是明白优势所在了?
这样for的上界刚好就是10,就是array的元素个数了啊
所以C这样的设计,大大的减少了我们脑筋急转弯的机会,妙哉!

所以日后大家Coding的时候,一定要使用第一种的结构,多方便啊

结语

路漫漫其修远兮,吾将上下而求索
路漫漫其修远兮,吾将上下而求索
路漫漫其修远兮,吾将上下而求索

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zz709196484/article/details/52374347
文章标签: c语言
个人分类: C/C++
想对作者说点什么? 我来说一句

TCP协议无边界的问题

seamanj seamanj

2014-10-14 01:27:55

阅读数:1572

没有更多推荐了,返回首页

不良信息举报

边界问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭