在某些地方,命令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);
}
答案 0 :(得分:3)
5/2
给出一个整数作为结果,而不是浮点数,而printf不能自动转换为另一种类型,因为赋值可以。如果使用GCC进行编译,则会收到警告“format'%f'需要类型为'double'的参数,但参数2的类型为'int'”。 (是,double。所有浮点数在被发送到像printf这样的变量参数函数之前都会被转换为双精度。)
您发送的参数(整数)与格式字符串%f
不匹配。根据C标准,这将导致它所谓的“未定义行为”,这意味着任何事情都可能发生。然而,通常发生的是,printf将查看浮点数所在的内存中的位置,如果你已经发送了一个作为参数,并采取它在那里找到的任何东西并解释它作为一个浮点数。由于典型的int
是32位,典型的double
是64位,因此printf将获取一些其他数据,可能是之前调用的数字65!
要解决此问题,请向printf发送一个浮点数,例如使用5.0/2
,(double)5/2
或2.5
代替5/2
。