为什么使用printf输出不同?

在某些地方命令printf("%f\n", 5 / 2); 是不同的。 为什么,以及如何解决这个问题?

 int main() { int a = 65; char c = (char)a; int m = 3.0/2; printf("%c\n", c); // output: A printf("%f\n", (float)a); // output: 65.000 printf("%f\n", 5 / 2); // output: 65.000 system("PAUSE"); printf("%f\n", 5.0 / 2); // output: 2.5000 printf("%f\n", 5 / 2.0); // output: 2.5000 printf("%f\n", (float)5 / 2); // output: 2.5000 printf("%f\n", 5 / 2); // output: 2.5000 system("PAUSE"); printf("%f\n", 5 / (float)2); // output: 2.5000 printf("%f\n", (float)(5 / 2)); // output: 2.0000 printf("%f\n", 5 / 2); // output: 2.0000 system("PAUSE"); printf("%f\n", 5.0 / 2); // output: 2.5000 printf("%d\n", m); // output: 1 printf("%f\n", 5 / 2); // output: 2.5000 system("PAUSE"); return(0); } 

5/2给出一个整数作为结果,而不是一个浮点数,而printf不能自动转换为另一种类型,因为赋值可以。 如果使用GCC进行编译,则会收到警告“format’%f’需要类型为’double’的参数,但参数2的类型为’int’”。 (是,双。在发送到像printf这样的变量参数函数之前,所有浮点数都会转换为双精度数。)

您发送的参数(整数)与格式字符串%f不匹配。 根据C标准,这将导致它所谓的“未定义行为”,这意味着任何事情都可能发生。 但是, 通常情况下,printf会查看浮点数所在的内存中的位置,如果你已经将一个作为参数发送,并取其在那里找到的任何内容并将其解释为浮点数。 由于典型的int是32位,典型的double是64位,printf将获取一些其他数据,可能是之前调用的数字65!

要解决此问题,请向printf发送一个浮点数,例如使用5.0/2(double)5/22.5而不是5/2