[带有负矢量大小计算的C ++行为

问题描述 投票:1回答:2

使用如下所示的参数调用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。

c++ pow
2个回答
3
投票

.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;
} 

1
投票

除了可接受的答案,我想指出的是,在C ++ 20中,我们将具有std::ssize()自由函数,该函数返回size作为有符号类型值。然后

std::ssize()

将在没有显式类型强制转换的情况下产生正确的结果。

© www.soinside.com 2019 - 2024. All rights reserved.