对长整数数组求和时传递的垃圾值 我正在学习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辩护。噢,谢谢。新手犯的错误。我会记住这一点。谢谢。