我想知道为什么数组的平均值的结果总是错误的

sar*_*mdy 0 c arrays

(我想编写一个代码来计算数组元素的总和和平均值)我想找出错误平均结果的原因,其中平均值可能是浮点数,所以我进行了强制转换以使用以下方法将结果转换为浮点数(float)sum)/size.

注意:我知道如果我确定变量平均值这个问题将得到解决

float average = (float)sum/arr_size;
printf("The average of the array elements is: %f\n", average);
Run Code Online (Sandbox Code Playgroud)

但我需要分析我错误的平均输出

#include<stdio.h>
#define size 5
int main(void)
{ 
  int i,sum=0;
  int arr[size];
  printf("please enter array elements: \n");
  // for loop to scant element elemnt of array
  for(i=0;i<size;i++)
  {
      scanf("%d",&arr[i]);
  }
  // sum of array
  for(i=0;i<size;i++)
  {
      sum+=arr[i];
  }
  // print sum after fishing
  printf("the summation is : %d \n",sum);

  // average of array
  printf("The average of array : %d",(((float)sum)/size));

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

han*_*nie 5

您投射((float)sum))但仍在%d您的printf. 使用%f并添加换行符。

printf("The average of array : %f\n", (((float)sum)/size));
Run Code Online (Sandbox Code Playgroud)

  • 是的。C11 [§6.5.2.2 函数调用§6](http://port70.net/~nsz/c/c11/n1570.html#6.5.2.2p6): _如果表示被调用函数的表达式具有以下类型如果不包含原型,则对每个参数执行整数提升,并且类型为 float 的参数将提升为 double。这些称为默认参数促销._。这定义了“默认参数升级”。该段落还指出(在引用后的材料中),当您调用“printf()”时,您必须在范围内有一个原型,以避免未定义的行为[...继续...] (2认同)
  • […继续…] [§6.5.2.2 ¶7](http://port70.net/~nsz/c/c11/n1570.html#6.5.2.2p7): _如果表示被调用函数的表达式具有类型如果确实包含原型,则参数会像通过赋值一样隐式转换为相应参数的类型,并将每个参数的类型视为其声明类型的非限定版本。函数原型声明符中的省略号表示法会导致参数类型转换在最后一个声明的参数之后停止。默认参数提升是在尾随参数上执行的。_ (2认同)