Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;优先顺序-乘法前的强制转换 在C++函数下面,为什么数字[Max索引[1] [/COD] >转换为长Lo/,然后乘以数字[Max索引]?我以为你会把数字相乘然后施放_C++_Casting_Long Integer_Operator Precedence - Fatal编程技术网

c++;优先顺序-乘法前的强制转换 在C++函数下面,为什么数字[Max索引[1] [/COD] >转换为长Lo/,然后乘以数字[Max索引]?我以为你会把数字相乘然后施放

c++;优先顺序-乘法前的强制转换 在C++函数下面,为什么数字[Max索引[1] [/COD] >转换为长Lo/,然后乘以数字[Max索引]?我以为你会把数字相乘然后施放,c++,casting,long-integer,operator-precedence,C++,Casting,Long Integer,Operator Precedence,另外,将向量数类型设置为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] <&

另外,将向量数类型设置为
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;
}
long-long MaxPairwiseProductFast(常量向量和数字){
int n=numbers.size();
int max_index1=-1;
cout>n;
向量数(n);
对于(int i=0;i>数字[i];
}
long long result=MaxPairwiseProductFast(数字);
库特
在执行乘法之前,数字[max_index2]
将提升为
long
。 如果将两个
int
相乘,结果溢出,则将该结果强制转换为
long
,将无法实现任何效果,因此您必须先强制转换
,然后再进行乘法

将向量数类型设为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;
}
如果您知道单个数字适合一个
int
,但两个
int的相乘结果可能溢出,这将有助于节省空间

在执行乘法之前,数字[max_index2]
将提升为
long
。 如果将两个
int
相乘,结果溢出,则将该结果强制转换为
long
,将无法实现任何效果,因此您必须先强制转换
,然后再进行乘法

将向量数类型设为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;
}
如果您知道单个数字适合一个
int
,但两个
int的相乘结果可能溢出,这将有助于节省空间

我想你会把数字相乘然后施放

假设您的两个操作数的值为
std::numeric\u limits::max()
。这是
int
可以表示的最大值,并且(因为它是正整数)将该数字平方的结果更大

当您将两个
int
值相乘时,结果也是一个
int
。请参见(特别是转换、整数提升和有符号类型溢出)

由于根据定义,结果大于可存储在
int
中的最大值,因此使用
int
s进行此乘法会产生未定义的结果。您需要使用足够大的类型执行乘法以存储结果

我想你会把数字相乘然后施放

假设您的两个操作数的值为
std::numeric\u limits::max()
。这是
int
可以表示的最大值,并且(因为它是正整数)将该数字平方的结果更大

当您将两个
int
值相乘时,结果也是一个
int
。请参见(特别是转换、整数提升和有符号类型溢出)


由于根据定义,结果大于可以存储在
int
中的最大值,因此使用
int
s进行乘法会得到一个未定义的结果。您需要使用足够大的类型来执行乘法。这不就是放括号的情况吗?括号太长了乘法是用long long而不是int来完成的,以防止int溢出。您可能认为强制转换很昂贵,但实际上并不昂贵。x86处理器有一条特殊的
movsx
指令(使用符号扩展移动)它可以将
int
动态转换为
long
,同时将其加载到乘法的位置。因此它基本上是免费的。澄清此类代码的一种方法是使用
静态转换
:而不是
(long-long)数字[max_index1]
(注意没有多余和混乱的括号)到
static\u cast(数字[max\u index1])
。这不只是放括号的情况吗?它被强制转换为long-long,因此乘法是用long-long而不是int来完成的,以防止int溢出。你可能认为强制转换很昂贵,但实际上并不昂贵。x86处理器有一条特殊的
movsx
指令(带符号扩展名移动)可以将
int
动态转换为
long
,同时将其加载到乘法位置。因此基本上是免费的。澄清此类代码的一种方法是使用
静态转换
:而不是
(long-long)数字[max\u index1]
(注意没有多余的和令人困惑的括号)到
静态转换(数字[max\u index1])