【发布时间】:2021-12-13 20:28:36
【问题描述】:
我编写了一个函数,该函数接收双矩阵并向后查找零条目。如果找到一个,则将该条目的值更改为-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_t j = dim - 1;,j >= 0始终为真。所以你有越界访问,而不是停止循环。 -
[OT]:
(matrix[j])[i]不用括号,matrix[j][i]就够了。 -
@Jarod42 现在一切都说得通了!奇怪的是,当尝试递减当前值为
0的size_t变量时没有任何抱怨。谢谢!! -
@edgystyle
unsigned整数类型被定义为使用模运算工作,因此需要从 0 递减以返回最大值。由于这是可靠的,因此开发人员可以有意义地使用它,因此不一定是错误。当允许的事情完成时,抱怨是不切实际的。不过,对于signed整数类型,上溢和下溢是未定义行为,编译器可能发出警告,或者它可能在运行时崩溃或抱怨。 -
@Jarod42 gcc 确实对此发出警告,但您需要
-Wextra或-Wtype-limits:godbolt.org/z/ThMnGvPrE