使用int
打印printf("%f\n", myNumber)
时,为什么会出现错误的值?
我不明白为什么它使用%d
打印正常,但不能打%f
。它不应该只添加额外的零吗?
int a = 1;
int b = 10;
int c = 100;
int d = 1000;
int e = 10000;
printf("%d %d %d %d %d\n", a, b, c, d, e); //prints fine
printf("%f %f %f %f %f\n", a, b, c, d, e); //prints weird stuff
答案 0 :(得分:14)
int
s,但是告诉printf
您传递了float
s。由于这两种数据类型具有不同且不兼容的内部表示,因此您将获得“乱码”。
当你将变量传递给像printf
之类的变量函数时,没有“自动强制转换”,这些值作为它们实际的数据类型传递给函数(或者在某些情况下升级为更大的兼容类型)
你所做的有点类似于:
union {
int n;
float f;
} x;
x.n = 10;
printf("%f\n", x.f); /* pass in the binary representation for 10,
but treat that same bit pattern as a float,
even though they are incompatible */
答案 1 :(得分:4)
如果要将它们打印为浮点数,可以在将它们传递给printf函数之前将它们转换为float。
printf("%f %f %f %f %f\n", (float)a, (float)b, (float)c, (float)d, (float)e);
答案 2 :(得分:3)
a,b,c,d和e不是浮点数。 printf()将它们解释为浮点数,这会将奇怪的东西打印到你的屏幕上。
答案 3 :(得分:2)
在printf()
中使用不正确的格式说明符会调用Undefined Behaviour
例如:
int n=1;
printf("%f", n); //UB
float x=1.2f;
printf("%d", x); //UB
double y=12.34;
printf("%lf",y); //UB
注意:double
中printf()
的格式说明符为%f
。
答案 4 :(得分:1)
问题是...... printf
内部。发生以下情况
if ("%f") {
float *p = (float*) &a;
output *p; //err because binary representation is different for float and int
}
答案 5 :(得分:0)
printf和variable参数的工作方式是字符串中的格式说明符,例如“%f%f”告诉printf类型,从而告诉参数的大小。通过为参数指定错误的类型,它会变得混乱。
查看stdarg.h以获取用于处理变量参数的宏
答案 6 :(得分:0)
对于“normal”(指定了所有类型的非variadac函数),编译器会将整数值类型转换为需要的浮点类型。
variadac参数不会发生这种情况,总是按“原样”传递。