对长整数数组求和时传递的垃圾值 我正在学习C++中的代码。我遇到了一个问题,需要生成一个函数来将非常大的数字相加并返回总和。我看到一种神秘的行为。当我在返回值之前在函数aVeryBigSum内打印数字veryBigSum时,它工作正常 #include <bits/stdc++.h> #include <vector> using namespace std; long long aVeryBigSum(int n, vector <long long> ar) { long long veryBigSum; for(vector<long long>::iterator it = ar.begin(); it != ar.end(); ++it ) veryBigSum += *it; cout << veryBigSum << "\n"; return veryBigSum; } int main() { int n; cin >> n; vector<long long> ar(n); for(int ar_i = 0; ar_i < n; ar_i++){ cin >> ar[ar_i]; } long long result = aVeryBigSum(n, ar); cout << result << endl; return 0; }

对长整数数组求和时传递的垃圾值 我正在学习C++中的代码。我遇到了一个问题,需要生成一个函数来将非常大的数字相加并返回总和。我看到一种神秘的行为。当我在返回值之前在函数aVeryBigSum内打印数字veryBigSum时,它工作正常 #include <bits/stdc++.h> #include <vector> using namespace std; long long aVeryBigSum(int n, vector <long long> ar) { long long veryBigSum; for(vector<long long>::iterator it = ar.begin(); it != ar.end(); ++it ) veryBigSum += *it; cout << veryBigSum << "\n"; return veryBigSum; } int main() { int n; cin >> n; vector<long long> ar(n); for(int ar_i = 0; ar_i < n; ar_i++){ cin >> ar[ar_i]; } long long result = aVeryBigSum(n, ar); cout << result << endl; return 0; },c++,C++,以上各项的输出为: 5 1000000001 1000000002 1000000003 1000000004 1000000005 5000000015 5000000015 5 1000000001 1000000002 1000000003 1000000004 1000000005 5004197743 但是当我没有在aVeryBigSum函数中打印数字时,main中的cout语句会显示一些垃圾值 #include <bits/stdc++.h> #include &

以上各项的输出为:

5
1000000001 1000000002 1000000003 1000000004 1000000005
5000000015
5000000015
5
1000000001 1000000002 1000000003 1000000004 1000000005
5004197743
但是当我没有在
aVeryBigSum
函数中打印数字时,
main
中的
cout
语句会显示一些垃圾值

#include <bits/stdc++.h>
#include <vector>

using namespace std;

long long aVeryBigSum(int n, vector <long long> ar) {

    long long veryBigSum;

    for(vector<long long>::iterator it = ar.begin(); it != ar.end(); ++it )
        veryBigSum += *it;

    return veryBigSum;
}

int main() {
    int n;
    cin >> n;
    vector<long long> ar(n);

    for(int ar_i = 0; ar_i < n; ar_i++){
        cin >> ar[ar_i];
    }

    long long result = aVeryBigSum(n, ar);
    cout << result << endl;
    return 0;
}
以上各项的输出为:

5
1000000001 1000000002 1000000003 1000000004 1000000005
5000000015
5000000015
5
1000000001 1000000002 1000000003 1000000004 1000000005
5004197743

有人能给我解释一下为什么会这样吗?我的意思是,打印值如何影响变量在函数之间的传递?

您需要初始化累加器:

long long veryBigSum = 0;

这只是偶然的(未定义的行为)你有时会得到正确的答案。

在计算总和之前将
veryBigSum
初始化为
0
。我怀疑你看到了UB的症状,因为
veryBigSum
没有初始化。@CinCout那么发生这种行为是因为编译器优化吗?@sohnryang没有编译器优化。这是未定义的行为。@Sohnrhyang无法为UB辩护。噢,谢谢。新手犯的错误。我会记住这一点。谢谢。