使用如下所示的参数调用pow
函数后它会产生一些较高的数字,就像访问某个无效的内存位置一样。我不知道为什么会这样,任何帮助将不胜感激。
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int main() {
vector<vector<int>> G = {
{1, 2, 3},
{0, 4}
};
cout << pow(G[1].size() - G[0].size(), 2) << endl;
return 0;
}
此打印1.84467e + 019。
.size()
的类型为unsigned
,并且当左操作数小于右操作数时,不能简单地将它们相减。
尝试一下:
cout << pow((long) G[1].size() - (long)G[0].size(), 2) << endl;
~~~~~~ ~~~~~~
但是,该解决方案基于以下假设:将.size()
的结果转换为signed long
。
如果您想要更具防御性的代码,请尝试以下代码:
size_t size_diff(size_t s0, size_t s1)
{
return s0 < s1? (s1 - s0) : (s0 - s1);
}
int main() {
// ...
cout << pow(size_diff(G[1].size(), G[0].size()), 2) << endl;
}
除了可接受的答案,我想指出的是,在C ++ 20中,我们将具有std::ssize()
自由函数,该函数返回size作为有符号类型值。然后
std::ssize()
将在没有显式类型强制转换的情况下产生正确的结果。