为什么我的代码返回0.00?

时间:2017-02-26 07:15:41

标签: c return function-call comma-operator

#include <stdio.h>
#include <math.h>

float math(int, int, int, int, int, float, float, float);

main() {
  int a, b, c, d, e;
  float sum, avg, sd;
  printf("Enter Five Integers->");
  scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
  math(a, b, c, d, e, sum, avg, sd);
  printf("Sum=%.2f\nAverage=%.2f\nStandard Deviation=%.2f", sum, avg, sd);
}

float math(int a, int b, int c, int d, int e, float sum, float avg, float sd) {
  sum = a + b + c + d + e;
  avg = (sum) / 5;
  sd = pow(
      ((pow(a - avg, 2) + pow(b - avg, 2) + pow(c - avg, 2) + pow(d - avg, 2),
        pow(e - avg, 2)) /
       5),
      0.5);
  return sum, avg, sd;
}

我的程序总是返回0.00的答案。任何人都可以解释我的代码有什么问题吗?

2 个答案:

答案 0 :(得分:1)

TL; DR 因为,您的代码会调用undefined behavior,并且无法证明输出的合理性。

首先要阐述声明

 return sum, avg, sd;

没有做你认为它正在做的事情。它不会将三个值一起返回,而是由于comma operator的使用,它仅返回sd

也就是说,你没有在代码中的任何地方收集函数调用的返回值,所以你无法从调用者函数调用返回任何有效的输出。

之后,您最终使用

 printf("Sum=%.2f\nAverage=%.2f\nStandard Deviation=%.2f", sum, avg, sd);

其中,提供的变量(自动,局部变量)保持未初始化,基本上试图利用调用undefined behavior的不确定值。

最后,对于托管环境,main()的符合签名至少应为int main(void)

解决方案:你需要

  • 将指针传递给您要在其中存储来自被调用函数的结果的变量,然后在调用者中使用它们来检索更新的值。

  • 形成一个结构,其中包含要为其返回计算值的所有变量,填充并返回结构。然后,在调用者中,在另一个结构类型变量中收集返回的值,然后使用单个成员元素来打印该值。

答案 1 :(得分:0)

您的代码中几乎没有接受点。

  1. 在C中,您不能从函数返回多于1个值。您正在尝试返回3个值,因为这些值使用“逗号(,)”分隔,只返回最后一个值。
  2. 两个函数的局部变量之间存在差异。您无法在1个函数中分配它们,并且在没有正确引用的情况下在其他函数中使用它。
  3. 您将功能设为“call by value”(在链接中详细了解)。当您需要更改值时,应使用“call by refernce”,它使用指针。
  4. 因此,最简单的解决方法是使用全局变量。

    set(handles.axes1,'Rotation',-25);