c - 为什么我的代码返回 0.00?

标签 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。谁能解释一下我的代码有什么问题吗?

最佳答案

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)

解决方案:您需要执行以下任一操作

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

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

关于c - 为什么我的代码返回 0.00?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42465783/

相关文章:

c++ - 如何从内部运算符构造函数正确调用复制构造函数?

javascript调用函数10次,间隔1秒

c - 取消引用指向不完整类型的指针|

c - c中的二进制到十进制算法给出奇怪的结果

c - C 中的 else...if 语句是否等于 else { if }?

javascript - 迭代对象数组时返回 false 或 true

c++ - 由于值返回函数中的错误,程序无法编译。它说未声明的标识符

java - 如何重新提示允许用户继续转换值?

perl - Perl 中的函数调用和 goto &NAME 有什么区别?

c - 如何在 C 中将 double 组转换为整数数组?