缺少循环会使代码无用

Absence of loop is rendering code useless?

本文关键字:代码 无用 循环      更新时间:2023-10-16

首先,这不是家庭作业。我正在用我为自己买的一本书来学习C++在家里开始,其中包含一个我坚持的练习。它问我以下代码有什么问题,但我似乎找不到它。首先,我认为这与没有 while 或 for 循环的事实有关,因此它无法重复自己,使"i"无用,但我不确定这是否是这里真正的问题。

for (int i = 0; i <= phrase.size(); ++i)
{
    cout << "Character at position " << i << " is: " << phrase[i] << endl;
}

条件是错误的:i <= phrase.size()应该是i < phrase.size()。说短语是 10 个元素的向量。 size()将返回 10,但在循环的最后一次迭代中,phrase[10] 正在访问一个不存在的元素。越界取消引用是未定义的行为,按照C++标准,这会使整个程序格式不正确。

i < phrase.size()  // Given that you are starting from 0th index, I assume
                   // that the valid array indexes are 0 to N-1

我怀疑是 <= size(( 的问题所在,在最后一个循环中,短语 [i] 实际上是数组末尾的一个,导致错误的引用,所以应该是:

for (int i = 0; i < phrase.size(); ++i) 
{ 
    cout << "Character at position " << i << " is: " << phrase[i] << endl; 
} 

问题出在这一行:

for (int i = 0; i <= phrase.size(); ++i)

i的值将在一点等于 phrase.size() 时,当稍后由 phrase[i] 索引时是越界的,因为 C++ 中的 indixing 是从零开始的。

始终包含起始边界并排除最后一个边界通常是一个很好的准则。

所以写:

for (int i = 0; i < phrase.size(); i++)

这样我从 0 开始,到最后一项结束。

<= phrase.size()应该< phrase.size()。循环的最后一次迭代将具有等于 phraze.size()i,这是越界的,因为无论您迭代什么,都以索引 0 开头。

假设您有 10 个项目,但计算它们的数字将看起来像 0、1、8、9。因此,您应该通过"严格较少"运算符进行检查。 这个事实第一次令人困惑,但随后你会看到它有多舒服。