C语言函数与类型的关系

img
实参类型应该符合函数要求,实参3.09应该转化为Int型再传给形参
不明白为什么将3.09转化为3之后又转化为3.0,最后结果不应该返回int型吗
为什么结果 从9.42477 转为9 又转为9.000000

首先fun(3.09),因为fun(int m)函数定义的参数是int类型,当你传入3.09时,自动转换
相当于fun((int)3.09),即3.09->3
然后进入循环 3.14159 * m,因为乘号的一边是浮点数,所以int类型m会自动转换为浮点数,相当于 3.14157 * (double)3,即3->3.0
浮点计算之后,结果是9.42477,但int fun()说明函数返回值是int,这里也有类型转换,相当于return (int)(3.14159 * m),即9.42477->9
函数返回9,此时赋值语句相当于double x= 9,因为是把int赋值给double,又会自动转换,相当于double x = (double)fun(3.09);,即9->9.0

这种参数和变量不一致导致的自动转换称为隐式类型转换,可以通过括号里放类型的方式进行和它相对的显式类型转换,如果你的代码全都写成显式转换,就是下面的效果

int fun(int m) {
    return (int) (3.14159 * (double)m);
}

double x = (double)fun((int)3.09);

其实这些转换都是存在的,只是编译器替你自动补上了

① 3.09转化为3之后又转化为3.0
3.09转化成3 是因为m的传参是int类型,编译器会自动将参数进行转型,转成整数。
3转成3.0 是因为计算的时候有小数部分,会自动转成往上一层的类型(可能是float,也可能是double,不过肯定都是小数了)。
② 结果从9.42477 转为9 又转为9.000000
9.42477 转为9 因为函数的返回值是int ,不带小数
9 又转为9.000000 这个是因为 x 的变量类型是double型,而返回值是int,所以这里会进行强制转换,转成 x 的类型(double)