#include<stdio.h>
#include<math.h>
int main()
{
float i = 2.5;
printf("%d\n%d\n%d",i,i,i);
}
当我编译这个使用gcc和运行它,我得到这个作为输出:问题而打印浮点值
0
1074003968
0
为什么它不只是打印
2
2
2
#include<stdio.h>
#include<math.h>
int main()
{
float i = 2.5;
printf("%d\n%d\n%d",i,i,i);
}
当我编译这个使用gcc和运行它,我得到这个作为输出:问题而打印浮点值
0
1074003968
0
为什么它不只是打印
2
2
2
的"%d"
格式说明符用于十进制整数。改为使用"%f"
。
然后花点时间阅读printf()
man page。
%d
打印十进制(int)
s,而不是(float)
s。 printf()
不能说明你通过了一个(float)
(C没有本地对象;你不能问它的值是什么类型);您需要为传递的类型使用适当的格式字符。
你传递一个float
(将被转换为double
)到printf
,但告诉printf
期望的int
。结果是未定义的行为,至少在理论上,任何事情都可能发生。
将通常发生的是printf
会从堆栈sizeof(int)
字节,并解释任何位模式,他们持有为int
,并打印出来,恰好代表了什么价值。
您几乎可以肯定需要的是将float
转换为int
,然后再将其传递到printf
。
+1用于实际解释发生了什么,而不是仅仅说“使用'%f'”。 – 2012-04-25 20:47:02
“%d”是十进制整数(通常是32位整数)的说明符,而“%f”说明符用于十进制浮点。 (通常是双重或浮动)。
如果只想浮点数的非小数部分,你可以指定精度为0
即
float i = 2.5;
printf("%.0f\n%.0f\n%.0f",i,i,i);
注意到你也可以每个值转换为int,它会给出相同的结果。
printf("%d\n%d\n%d",int(i),int(i),int(i));
你可能还想用'-Wall -Wextra'编译你的代码。 GCC抱怨format'%d'需要'int'类型的参数,但是当我编译代码并打开警告时,参数2的类型为'double'。 – 2012-04-25 20:50:15
相关:http://stackoverflow.com/questions/1505146/why-is-x-and-y-always-0-with-a-float – 2012-04-25 21:02:59
因为你骗了printf()。你告诉它会有3个整数,但给了它3个浮点数。 – 2012-04-25 21:34:19