2

可能重复:
将 int 打印为 float 时 printf 的行为是什么?

int main()
{
 int x=4;
 int y=987634;
 printf("%f %f",x,y);
}

在编译此代码时,我得到的输出为 0.000000 0.000000。不应该将 x 和 y 类型提升为浮点数吗?O/P 不应该是 4.000000 和 987634.000000 吗?谁能帮我这个。提前感谢。

4

5 回答 5

5

转换发生在具有包含特定参数的原型的函数的参数上。的原型printf()不包括第一个之后的具体参数

int printf(const char *format, ...);

因此,除了“默认参数转换”定义的参数之外,第一个参数之后不会自动转换(基本上任何等级低于 to 的整数类型和任何等级低于tointint浮点类型(谢谢,Pascal Cuoq) )。您需要自己使用强制转换操作显式转换它们doubledouble

    printf("%f %f\n", (double)x, (double)y);

哦……你真的,真的,真的应该包括有问题的原型的标题(在未定义行为的惩罚下)

#include <stdio.h>
于 2012-11-27T16:50:15.710 回答
1

编译器不知道您的printf格式字符串会将参数解释为浮点数。它以 s 的形式直接通过它们int

因为printf是一个可变参数函数,所以传递有意义的参数真的取决于你。

于 2012-11-27T16:49:11.133 回答
0

尝试printf("%i %i",x,y);将整数打印为4 987634. 有关printf格式的详细信息,请参见http://www.cplusplus.com/reference/cstdio/printf/

于 2012-11-27T16:49:11.567 回答
0

ints 和floats 在内存中的存储方式不同,但是您的编译器不知道您需要浮点数。您需要显式转换它们。

printf("%f %f",(float)x,(float)y);
于 2012-11-27T16:51:08.800 回答
0

可变参数函数(printf() 是其中之一)不进行类型检查,因为可变参数签名不包含任何类型信息。因此,没有隐式类型转换。您必须手动完成:

printf("%f %f", (double)x, (double)y);
于 2012-11-27T16:51:36.503 回答