c ++优先顺序 - 在乘法之前进行转换

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

在下面的C ++函数中,为什么numbers[max_index1]转换为long long然后再乘以numbers[max_index2]?我想你会把数字乘以然后再投出?

使矢量数字类型为long long而不是int也没有意义,因此铸造不是必要的吗?

long long MaxPairwiseProductFast(const vector<int>& numbers) {

    int n = numbers.size();

    int max_index1 = -1;
    cout << "value at max_index1 is " << numbers[max_index1] << std::endl;
    for(int i = 0; i < n; i++)
        if((max_index1 == -1) || (numbers[i] > numbers[max_index1]))
            max_index1 = i;


    int max_index2 = -1;
    for(int j = 0; j < n; j++)
        if((numbers[j] != numbers[max_index1]) && ((max_index2 == -1) || (numbers[j] > numbers[max_index2])))
            max_index2 = j;

    return ((long long)(numbers[max_index1])) * numbers[max_index2];
}

int main() {
    int n;
    cin >> n;
    vector<int> numbers(n);
    for (int i = 0; i < n; ++i) {
        cin >> numbers[i];
    }

    long long result = MaxPairwiseProductFast(numbers);
    cout << result << "\n";
    return 0;
}
c++ casting long-integer operator-precedence
2个回答
1
投票
((long long)(numbers[max_index1])) * numbers[max_index2];

在进行乘法运动之前,numbers[max_index2]将被提升为long long。如果你乘以两个int's并且结果溢出,那么你可以通过将结果转换为long long来实现任何目标,所以你先cast,然后乘以。

将矢量数字类型设置为long long而不是int也没有意义,因此没有必要进行转换?

如果您知道单个数字符合int,但两个int's相乘的结果可能会溢出,这将有助于节省空间。


1
投票

我想你会把数字乘以然后再投出?

想象一下,你的两个操作数具有值std::numeric_limits<int>::max()。这是int可以表示的最大值,并且(因为它是一个正整数),这个数字的平方结果甚至更大。

当你乘以两个int值时,结果也是int。请参阅here(特别是转换,整数提升和签名类型的溢出)。

由于定义结果大于您可以存储在int中的最大值,因此使用ints进行此乘法会得到未定义的结果。您需要使用足以存储结果的类型执行乘法运算。

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