printf()问题

来源:百度知道 编辑:UC知道 时间:2024/05/14 14:22:22
#include <math.h>
float fun(float a,float b,float c)
{
extern float s;
s=(a+b+c)/2.0;
return sqrt(s*(s-a)*(s-b)*(s-c));
}
float s;
main()
{
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
printf("%f\n%f",fun(a,b,c),s);
printf("\n%f",s);
getch();
}
为何2次s输出的结果不同??我在Debug里看的s值是一样的(第2次输出的是正确的结果)

函数fun中的s被申明为外部变量,这样编译器会在函数之外找和extern float s;类型名称相同的变量进行操作,第一个printf中运行了fun函数,这时fun会修改外部的s的值,从而导致第2次printf的s值的改变.
第一次的s之所以会是不正确的结果,是因为在把s传入printf的参数栈的时候,fun并未得到计算,从而s并未改变。

BTW:这个行为是编译器相关的,在gcc中第一句即可得到正确的值

作用域不一样,
一个是全局的变量s,
一个是局部的静态变量s