2012-04-25 77 views
1
#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 
+1

你可能还想用'-Wall -Wextra'编译你的代码。 GCC抱怨format'%d'需要'int'类型的参数,但是当我编译代码并打开警告时,参数2的类型为'double'。 – 2012-04-25 20:50:15

+0

相关:http://stackoverflow.com/questions/1505146/why-is-x-and-y-always-0-with-a-float – 2012-04-25 21:02:59

+0

因为你骗了printf()。你告诉它会有3个整数,但给了它3个浮点数。 – 2012-04-25 21:34:19

回答

2

"%d"格式说明符用于十进制整数。改为使用"%f"

然后花点时间阅读printf() man page

0

%d打印十进制(int) s,而不是(float) s。 printf()不能说明你通过了一个(float)(C没有本地对象;你不能问它的值是什么类型);您需要为传递的类型使用适当的格式字符。

12

你传递一个float(将被转换为double)到printf,但告诉printf期望的int。结果是未定义的行为,至少在理论上,任何事情都可能发生。

通常发生的是printf会从堆栈sizeof(int)字节,并解释任何位模式,他们持有为int,并打印出来,恰好代表了什么价值。

您几乎可以肯定需要的是将float转换为int,然后再将其传递到printf

+0

+1用于实际解释发生了什么,而不是仅仅说“使用'%f'”。 – 2012-04-25 20:47:02

1

“%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));