#include <stdio.h>
float aver(float*,int);
float max = 0, min = 0; // define global variables
int main()
{
int i;
float num[10]; //input number
for (i = 0 ; i < 10 ; i++)
scanf("%f", &num[i]);
printf("%.2f %.2f %.2f ", max, min, aver(num, i)); //output max ,min and aver
return 0;
}
float aver(float*num,int n)
{
max = min = num[0];
int i;
float sum=0;
for (i=0; i<n-1; i++) {
if (max < num[i])
max = num[i]; //find max
else if (min > num[i])
min = num[i]; //find min
sum += num[i];
}
printf("%.2f %.2f \n ",max,min); //output the max and the min in the array num
return sum/n;
}
是我输入和获取的内容。
1 2 3 4 5 6 7 8 9 10
9.00 1.00
0.00 0.00 4.50 Program ended with exit code: 0
为什么函数max
中的min
和aver
可以正确输出,但在main
函数中它们是0
?
答案 0 :(得分:2)
未指定函数参数的评估顺序。因此,您的代码可能会在某些编译器上按预期工作,但可能会在其他编译器上产生意外结果。
你应该替换
printf("%.2f %.2f %.2f ",max,min,aver(num, i)); //output max ,min and aver
带
{
float average = aver(num, i);
printf("%.2f %.2f %.2f ",max,min, average); //output max ,min and aver
}
使代码行为得到很好的定义。
来自C99§6.5.2.2p10:
功能指示符的评估顺序,实际 参数和实际参数中的子表达式是 未指定,但在实际调用之前有一个序列点。
答案 1 :(得分:2)
printf
的参数的评估顺序未指定,即max
和min
可以在评估aver
函数之后或之前打印。在您的情况下,打印aver
和max
后会调用min
,然后此函数会修改max
和min
变量。
要解决此问题,只需将aver
作为另一个printf