gpt4 book ai didi

c++ - 平凡的函数给出了意想不到的返回值

转载 作者:行者123 更新时间:2023-12-05 09:03:36 26 4
gpt4 key购买 nike

我编写了一个函数,它接收一个 double 矩阵并向后查找零条目。如果找到一个,它会将条目的值更改为 -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);
}

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

最佳答案

如评论中所述,由于 size_tunsigned 类型,因此 j >= 0i >= 0 比较将始终评估为“真”,并且当任一索引达到零时,下一个值(在递减该零值之后)将返回到 size_t 的最大值 类型,导致未定义的行为(越界访问)。

绕过这个问题的一个很好的“技巧”是使用“转到”伪运算符 -->,它实际上是两个运算符的组合:What is the "-->" operator in C/C++? .

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

这是使用这种方法的函数版本(请注意,我在 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;
}

关于c++ - 平凡的函数给出了意想不到的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69757433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com