计算总和但未存储。为啥?

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函数中的形参sumupmain中的实参sumup是不同的对象,所以函数中sumup的任何更改都不会反映在@ 987654326@main

有几种方法可以解决这个问题:

    在 C++ 中,您可以将sum 中的sumup 参数定义为mainsumup 变量的引用
    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)

【讨论】:

以上是关于计算总和但未存储。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何找出为啥所有数据子集的总和比总和小1

Yii2 - 如何获得计算数字的总和

为啥云代码存储在我的计算机中

为啥我无法计算我订购的列的运行总和?

Gradle 搜索 Ivy 服务但未定义 Ivy 配置/存储库

为啥这个 MySQL 存储函数给出的结果与在查询中进行计算不同?