计算总和但未存储。为啥?
Posted
技术标签:
【中文标题】计算总和但未存储。为啥?【英文标题】:Sum computed but not stored. Why?计算总和但未存储。为什么? 【发布时间】:2017-05-12 21:05:10 【问题描述】:我今天开始学习 C 中的函数。我在函数“sum”中的问题,其中 I += 数组中的数字,它确实写入了数字的总和,但是当程序退出该“sum”函数时,我保存这些数字总和的整数重置为 0 和我似乎无法弄清楚为什么。 这是代码,我当然希望你能帮助我。
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
void arr(int hello[], int size)
srand(time(NULL));
for (int i = 0; i < size; i++)
hello[i] = rand() % 100;
void print(int hello[], int size)
for (int i = 0; i < size; i++)
cout << hello[i] << " ";
int sum(int hello[], int size, int sumup)
for (int i = 0; i < size; i++)
sumup += hello[i];
cout << endl;
cout << "Sum of these numbers: " << sumup << endl;
return sumup;
int SumEvenOrOdd(int sumup, int size)
int average = sumup / size;
cout << "Average of the all numbers in array: " << average << endl;
return average;
int main()
bool bye = false;
const int size = 10;
int hello[size], sumup = 0, input;
arr(hello, size);
print(hello, size);
sum(hello, size, sumup);
SumEvenOrOdd(sumup, size);
cin.get();
cin.get();
return 0;
【问题讨论】:
你为什么要在参数中传递sumup
?
这是 C++,不是 C。编辑标签以反映这一点。
【参考方案1】:
问题是sum
函数中的形参sumup
与main
中的实参sumup
是不同的对象,所以函数中sumup
的任何更改都不会反映在@ 987654326@main
。
有几种方法可以解决这个问题:
-
在 C++ 中,您可以将
sum
中的sumup
参数定义为main
中sumup
变量的引用:int sum( int hello[], int size, int &sumup )
// leave everything else the same.
在 C 和 C++ 中,您可以将 sum
中的 sumup
参数定义为 指针 指向 main
中的 sumup
变量:int sum( int hello[], int size, int *sumup ) // leading * is necessary
...
*sumup += hello[i]; // leading * is necessary
int main( )
...
sum( hello, size, &sumup ); // leading & is necessary
...
将sum
的结果分配回sumup
或其他变量:int newsum = sum( hello, size, sumup );
虽然问题变成了,为什么首先将sumup
作为参数传递?只需在 sum
中声明一个局部变量来保存该值,然后返回:int sum( int hello[], int size )
int result = 0;
for ( int i = 0; i < size; ++i )
result += hello[i];
return result;
int main( )
...
int sumup = sum( hello, size );
...
【讨论】:
很好的解释!传递sumup
值可能是从该值开始添加。【参考方案2】:
将您的线路 sum(hello, size, sumup);
更改为 sumup = sum(hello, size, sumup);
。然后你的返回值会保存在变量 sumup 中。
如果您不想通过返回值保存 sumup 变量,则应了解按引用调用(以及按值调用与按值调用有何不同)。然后您可以写入函数参数 sumup 并更改原始值而不是函数内部的本地副本。
这将打开指针操作的蠕虫罐。 C 的最大乐趣来源之一 ;-)
示例:https://www.codingunit.com/c-tutorial-call-by-value-or-call-by-reference
【讨论】:
【参考方案3】:将函数参数作为引用传递,以便可以访问它们:
void sum(int hello[], int size, int& sizeup)
这将允许 sizeup 在函数之外保留它的值,因为您传递的是 sizeup 的引用。
【讨论】:
【参考方案4】:试试这个,
sumup = sum(hello, size, sumup);
你应该得到正确的汇总值。
【讨论】:
【参考方案5】:函数sum
返回一个没有接受它的变量的值。
改变这一行:
sum(hello, size, sumup);
到:
int my_sum = sum(hello, size, sumup);
然后你就可以在你的 main 中使用 my_sum 了。
另一种解决方案可以通过引用将sumup
传递给您的函数,只需将声明更改为:
void sum(int hello[], int size, int & sumup)
【讨论】:
以上是关于计算总和但未存储。为啥?的主要内容,如果未能解决你的问题,请参考以下文章