简单的函数给出了意想不到的返回值

edg*_*yle 2 c++ double boolean

我编写了一个函数,它接收双矩阵并向后查找零条目。如果找到,则将该条目的值更改为-2.0并返回true。否则返回false

这是代码:

#include <iostream>
#include <vector>

bool remove1zero(std::vector<std::vector<double>> & matrix)
{
    size_t dim = matrix.size();
    for (size_t j = dim - 1; j >= 0; j--)
        for (size_t i = dim - 1; i >= 0; i--)
            if ((matrix[j])[i] == 0.0)
            {
                (matrix[j])[i] = -2.0;
                return true;
            }
    return false;
}

int main()
{
    std::vector<std::vector<double>> testMatrix(3);
    testMatrix[0] = std::vector<double> {-2.0, -2.0, 3.0};
    testMatrix[1] = std::vector<double> {-2.0, -1.0, 3.0};
    testMatrix[2] = std::vector<double> {2.0, 2.0, -1.0};
    std::cout << remove1zero(testMatrix);
}
Run Code Online (Sandbox Code Playgroud)

由于该矩阵没有零条目,因此 if 条件不应激活,并且最终remove1zero应返回false。然而,事实并非如此。我已经在我的机器上以及http://cpp.sh/中尝试过,输出是1/ true。如果有任何关于为什么会发生这种情况的见解,我将不胜感激。

Adr*_*ica 5

正如评论中提到的,作为size_t符号类型,j >= 0i >= 0比较将始终size_t评估为“true”,并且当任一索引达到零时,下一个值(递减该零值后)将环绕到该类型的最大值,导致未定义的行为(越界访问)。

解决这个问题的一个不错的“技巧”是使用“goes to”伪运算符,-->它实际上是两个运算符的组合:C/C++ 中的“-->”运算符是什么?

您可以在循环中使用它for,如下所述,将“迭代表达式”留空(因为递减是在“条件表达式”中完成的),并在“初始化语句”中的更高索引处开始循环(因为减量将在进入循环体之前应用)。

这是使用这种方法的函数版本(请注意,我在表达式中包含了一个空格x-- > 0,以澄清实际上涉及两个单独的运算符):

bool remove1zero(std::vector<std::vector<double>>& matrix)
{
    size_t dim = matrix.size();
    for (size_t j = dim ; j-- > 0; )
        for (size_t i = dim ; i-- > 0; )
            if (matrix[j][i] == 0.0) {
                matrix[j][i] = -2.0;
                return true;
            }
    return false;
}
Run Code Online (Sandbox Code Playgroud)