全局变量输出不正确

时间:2015-01-15 11:56:36

标签: c global-variables

#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中的minaver可以正确输出,但在main函数中它们是0

2 个答案:

答案 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的参数的评估顺序未指定,即maxmin可以在评估aver函数之后或之前打印。在您的情况下,打印avermax后会调用min,然后此函数会修改maxmin变量。

要解决此问题,只需将aver作为另一个printf

中的参数调用即可