布尔值在 for 循环中没有变化

Boolean value not changing in for loop

本文关键字:有变化 循环 for 布尔值      更新时间:2023-10-16

我有一个 for 循环,可以在向量中搜索对象"Book"。 如果 refBook 在向量中,它应该返回 true。 如果不是,则为假。

int has = 0;
for (int i = 0; i < mBooks.size()-1; i++) {
    if (mBooks.at(i) == refBook) {
        has = 1;
        cout << "Has book " << has << endl;
    };
};
return has;

它正确地通过循环,如果 Book 在向量中,它将打印 cout 语句。 但是,它仍然返回 0。 如果 has = 1;相反,它将返回 1。 如果 Book 在向量中,它永远不会更改其值。

为什么会这样?

我只想抛出这正是std::find存在的目的:

bool has = (std::find(mBooks.begin(), mBooks.end(), refBook) != mBooks.end());

在编写循环时很容易犯错误(例如停止一次迭代短) - 这就是为什么有时首先尝试避免编写它们是很好的。

首先,您不需要在"if"块或"for"块的右括号后使用右分号。接下来,我怀疑问题可能是:

(int i = 0; i < mBooks.size()-1; i++)

看到负 1 了吗?这意味着您不会检查向量中的最后一项。如果这本书是矢量中的最后一项,你就不会拿起它!这张图很好地总结了我认为你遇到的问题。

试试这个:

int has = 0;
for (int i = 0; i < mBooks.size(); i++)
{
    if (mBooks.at(i) == refBook)
    {
        has = 1;
        cout << "Has book " << has << endl;
    }
}
return has;

这里有一些提示给你。C++有一个内置的布尔类型bool,你可以用它来代替整数来表示"true"和"false"(这是关键字!向量也可以像本机数组一样被索引,所以你可以用 [] 代替 'at'。因此,下面是一个稍微C++的代码版本:

bool has = false;
for (int i = 0; i < mBooks.size(); i++)
{
    if (mBooks[i] == refBook)
    {
        has = true;
        cout << "Has book " << has << endl;
    }
}
return has;

最后一个建议,更高级一些,是使用新的C++11"范围"语法,该语法可用于向量和列表等。我还将介绍"auto"和"break"关键字,我建议您熟悉这些关键字:

bool has = false;
for (auto& book : mBooks)
{
    if (book == refBook)
    {
        has = true;
        cout << "Has book " << has << endl;
        break;
    }
}
return has;

最后,值得一看的是 std::find 函数(编辑:我看到其他人提出了这个),它是为这种情况提供的。

这不是

你要找的代码(以绝地武士的方式挥手)。

由于内存损坏,如果打印语句,该函数(如现在)返回1

所以你的问题可能出在别处。

我会给出一点建议:如果你只是想看看这本书是否在那里,那么一旦你找到它,就没有必要继续寻找。你应该检查整个向量,在你跳过最后一项的那一刻。你最好这样:

int hasBook (TBook &refBook) {
    for (int i = 0; i < mBooks.size(); i++) {
        if (mBooks.at(i) == refBook) {
            cout << "Has book " << refBook << endl;
            return 1;
        }
    }
    return 0;
}