为什么输出以下C代码为0.000000?
#include <stdio.h>
void foo(float *);
int main()
{
int i = 10, *p = &i;
foo(&i);
}
void foo(float *p)
{
printf("%f\n", *p);
}
请解释你的答案。
答案 0 :(得分:4)
您正在使printf()
解释整数的位,就像它们是浮点的位一样。这是undefined behavior。
您期望得到什么结果?
答案 1 :(得分:1)
首先,当你的代码看起来像你的问题时,*p = &i;
行根本没有做任何事情。
接下来 - 您将指向int
变量的指针传递给期望float
的函数。就像评论中提到的@unwind一样,foo()
无法知道你撒了谎。
类型转换与您似乎认为的不同。
#include <stdio.h>
void foo(float *);
int main()
{
int i = 10; //try this and see it fails,
//then switch this line with float i = 10; and try again
foo(&i);
}
void foo(float *p)
{
printf("%f\n", *p);
}
编辑&gt;如果你坚持在某个地方进行类型转换......
#include <stdio.h>
void foo(float *);
int main()
{
int i = 10;
float p = (float)i;
foo(&p);
return 0;
}
void foo(float *p)
{
printf("%f\n", *p);
}
答案 2 :(得分:0)
Variadic functions使用可变数量的参数,而他们不知道条目参数的类型。
在printf
函数中,第一个参数是一个字符串,希望通过格式说明符指示以下参数的类型。
在您的代码中,您的说明符指示以下参数是float(Answer
),但您已传递整数。由于所有这种类型检查都是在运行时进行的,并且编译器对此一无所知,因此没有自动转换。
您的代码调用未定义的行为。
答案 3 :(得分:0)
试试这个:
#include <stdio.h>
void foo(int *);
int main()
{
int i = 10;
foo(&i);
}
void foo(int *p)
{
printf("%f\n",(float) *p);
}