原因在于printf函数printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值。
8/5的算术表达式的到的是一个整型常量1,它被以整型存储在内存中。
printf("%d\n", sizeof(8.0/5.0));
printf("%d\n", sizeof(8/5));
printf("float: %d\n", sizeof(float));
printf("int: %d\n", sizeof(int));
在我的环境下,float和int均为四字节,而浮点常量则是以8字节的double进行存储,而printf输出时,float是当double处理的,同样是使用8字节,当一个四字节数据用八字节浮点数的形式读出的时候,也就是会读之前的很多位0,最后按照(有效数字)×(基数2)pow(指数)的方式来取数,自然结果是0.000000
在例如如下程序中
printf("%f\n", 8/5);
printf("%f\n", 8.0/5.0);
printf("%f\n", 8/5);
在单独输出8/5时产生的是0.000000,而如果在输出8/5之前正常的输出一个浮点数据,那么在输出8/5时则产生了一个接近于1.600000的结果,原因应该与上述理由相同,printf在使用%f输出整型常量时,额外的读取了不属于整型大小的8字节数据,进而产生了区别于正确结果的输出。