这里发生了什么:
printf("result = %d\n", 1);
printf("result = %f\n", 1);
输出:
result = 1
result = 0.000000
如果我在尝试打印这些变量之前确保它们的类型,那么当然可以正常工作。为什么第二个打印语句没有被隐式转换为1.00000?
这里发生了什么:
printf("result = %d\n", 1);
printf("result = %f\n", 1);
输出:
result = 1
result = 0.000000
printf
只是一个具有可变参数数量的C函数,并且只有第一个(必需)参数具有指定类型(const char *
)。因此编译器“无法”知道它应该转换“额外”的参数——它在printf
实际读取格式字符串并确定它应该得到一个浮点数之前被传递。printf
作为一个特殊情况,并警告您有关不正确的参数(正如其他人所提到的,一些编译器至少会这样做,如果您要求他们)。但在一般情况下,它不能知道任意vararg函数使用的具体格式,也可能以复杂的方式构造格式字符串(例如在运行时)。char
和 short
会被提升为 int
,而 float
会被提升为 double
。 - tomlogic有趣,假设你放置了'1.0'应该没问题
我想printf只会获取变量的地址,它无法知道它是什么。但我认为编译器应该有良心地警告你。