c语言入门简单程序问题提问

int m=5;
float k;
k=m*m/(m+1);
printf(''k=%f\n",k); k=4.000000

int m=5;
float k;
k=m*m/(m+1.0);
printf(''k=%f\n",k); k=4.166667

两者结果不同的原因是什么?

第一种是整除,舍去了小数部分。

m*m/(m+1);

m+1结果为6
25/6

返回结果是整数,然后赋值给float类型的变量。
也就导致变量k结果中的小数部分全是0了。
第二种表达式中,分母是浮点类型,所以不是整除,会保留小数部分。


k=m*m/(m+1.0);

m+1.0结果为6.0
25/6.0

m+1.0转换为double类型了,这样的结果才是对的

因为m+1.0是浮点数,而m+1默认转化整型,而你要求的是输出浮点数,所以不是输出4而是输出4.000000。
Do you understand?

m*m/(m+1)算出来的结果是是int类型,保留整数,然后把整数赋值给float类型的k,才把int类型的过变成float类型。
而m*m/(m+1.0)先计算的是m+1.0,int和float运算的时候,隐形的就把类型变成浮点数了,所以赋值后结果就是浮点数

在不同类型的数据混合运行中,编译器会自动地进行转换数据类型,就将所有参与运算的数据先转换成同一种类型,然后再进行计算。规则如下:

  • 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。

  • 所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。

  • char 和 short 参与运算时,必须先转换成 int 类型。

下图对这种转换规则进行了更加形象地描述:

img

题中的第一种情况,参与运算的数据类型都是int,那么运算结果的数据类型是int,那么得到的结果是没有小数点后面的数值。
题中的第二种情况,参与运算的数据类型中包含了浮点数(1.0),那么结果结果的数据类型是浮点数,这样得到的结果才会有小数点后面的数值。