首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是off-by-one错误?我如何修复它?

什么是off-by-one错误?我如何修复它?
EN

Stack Overflow用户
提问于 2010-05-31 02:49:06
回答 5查看 33.3K关注 0票数 33

什么是off-by-one错误?如果我有一个,我该如何修复它?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-31 03:01:05

例如,当您编写off-by-one error以执行n次循环并编写类似以下内容时,就是这样:

代码语言:javascript
复制
for (int i = 1; i < n; ++i) { ... }

或者:

代码语言:javascript
复制
for (int i = 0; i <= n; ++i) { ... }

在第一种情况下,循环将被执行(n - 1)次,在第二种情况下,循环将被执行(n + 1)次,给出的名称为off-by-1。其他变化也是可能的,但通常,由于循环变量的初始值或循环的结束条件中的错误,循环被执行的次数过多或过少。

循环可以正确地写成:

代码语言:javascript
复制
for (int i = 0; i < n; ++i) { ... }

for循环只是while循环的一个特例。同样的错误也可能发生在while循环中。

票数 66
EN

Stack Overflow用户

发布于 2019-08-18 04:42:58

假设您有以下代码,其中包含一个数组和一个for循环:

代码语言:javascript
复制
char exampleArray[] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' };

for(int i = 0; i <= 11; i++)
{
  print(exampleArray[i])
}

看到这里的问题了吗?因为我计算出我的数组中有11个字符,所以我将我的循环设置为迭代11次。然而,在大多数语言中,数组从零开始,这意味着当我的代码打印出来的时候

代码语言:javascript
复制
exampleArray[11]

我将得到一个索引越界错误,因为示例中的数组在索引11处没有值。

在这种情况下,我可以通过简单地告诉我的循环少迭代一次来轻松解决这个问题。

调试此问题的最简单方法是打印出上下限,并查看哪个值生成索引越界错误,然后将您的值设置为比整个迭代过程中的值大一或小一。

当然,这假设错误是由超过或小于数组边界的循环生成的,还有其他情况会发生索引越界错误,然而,这是最常见的情况。越界索引总是指尝试访问由于过去的边界不在数据边界内而导致数据不存在的数据。

票数 3
EN

Stack Overflow用户

发布于 2019-12-03 22:00:23

off-by-one error是指当你期望某个值为N的东西,但实际上它最终是N-1或N+1。例如,你希望程序执行10次操作,但它最终执行了9或11次(一次太少或一次太多)。在编程中,这是在处理"for“循环时最常见的情况。

发生此错误的原因是您没有意识到您用来跟踪计数的数字可能与您正在计数的事物的数量不同。换句话说,您用来计算的数量可能与您正在计算的事物的总数不同。没有任何东西要求这两个东西是相同的。试着从0到10大声数,你最终会说出11个数字,但你说的最后一个数字是10。

预防这个问题的一种方法是认识到我们的大脑有一种倾向(可能是认知偏差)去犯这个错误。牢记这一点可以帮助你识别和预防未来的情况。但是我想你能做的最好的事情就是编写unit tests来防止这个错误。这些测试将帮助您确保代码正常运行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2939869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档