3

这里发生了什么:

printf("result = %d\n", 1);
printf("result = %f\n", 1);

输出:

result = 1
result = 0.000000

如果我在尝试打印它们之前确保这些变量的类型,它当然可以正常工作。为什么第二个打印语句没有被隐式转换为 1.00000?

4

5 回答 5

8

在第二种情况下,您的格式字符串和参数类型不匹配 - 因此结果是未定义的行为(u)r。

于 2010-11-16T20:56:19.160 回答
4

1 未转换为 1.0 的原因printf是“只是”一个具有可变数量参数的 C 函数,并且只有第一个(必需)参数具有指定的类型 ( const char *)。因此编译器“不能”知道它应该转换“额外”参数——它在实际读取格式字符串并确定它应该得到一个浮点数之前被传递。 printf

现在,诚然,您的格式字符串是一个编译时常量,因此编译器可以制作一个特殊情况printf警告有关不正确的参数(并且,正如其他人所提到的,一些编译器会这样做,至少如果您要求他们这样做) . 但在一般情况下,它无法知道任意 vararg 函数使用的具体格式,也可以以复杂的方式(例如在运行时)构造格式字符串。

总而言之,如果您希望将特定类型作为“变量”参数传递,则需要对其进行强制转换。

于 2010-11-16T21:56:59.397 回答
2

未定义的行为。一个 int 被视为浮点数

于 2010-11-16T20:56:50.830 回答
1

简短的回答是 printf 并不是真正的 C++。Printf 是一个 C 函数,它接受一个变量参数列表,并根据格式字符串中指定的类型将提供的参数应用于格式字符串。

如果您想要任何类型的实际类型检查,您应该使用流和字符串 - 实际 C++ 替代良好的旧 C 样式 printf。

于 2010-11-16T20:58:16.213 回答
0

有趣的是,如果你的 put '1.0' 大概没问题

我想 printf 只获取变量的地址,它无法知道它是什么。但我原以为编译器会礼貌地警告你。

于 2010-11-16T20:57:23.497 回答