off-by-one(大小差一)错误介绍

详细了解请移步这里

off-by-one,大小差一错误是一类常见的程序设计错误。这方面有一个经典的例子OpenSSH.去Google搜索关键词“OpenSSH off-by-one”可以了解相关状况。具体来说,

1. if(id < 0 || id > channels_alloc)...
2. if(id < 0 || id >= channels_alloc)...

第二句应该是正确的写法。举个更通俗的例子:

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

上述代码定义了长度为5的数组a,循环的目的是给数组元素初始化,赋值为0.但是,循环下标从1开始到5,出现了a[5]=0,这样的不存在的数组元素.这就是典型的“差一错误”(off-by-one).其实,貌似说栅栏柱错误(fencepost error)大家更熟悉。我问过身边的朋友,很多人知道这个问题。
如果你要建造一个100米长的栅栏,其栅栏柱间隔为10米,那么你需要多少根栅栏柱呢?11根或9根都是正确答案,这取决于是否要在栅栏的两端树立栅栏柱,但是10根却是错误的。 我想起来了我高中是数学老师告诉我们的一个很容易犯错的数学题目。从周一到周五一共有几天?也许你立即反应5-1=4,但是,下意识你也会说五天,实际上应该是5-1+1=5.转换到数学,数字1到数字5一共有几个数字?这里有一个公式 从M到N,一共有 M-N+1 项.

这个问题写出来后很简单,只不过在写代码的时候,往往比较容易忽略。尤其在涉及到数组操作两端界限的时候,如果不是从0开始计数,就要稍微考虑一下咯。

添加新评论