这里发生了什么:
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
如果我在尝试打印它们之前确保这些变量的类型,它当然可以正常工作。为什么第二个打印语句没有被隐式转换为 1.00000?
在第二种情况下,您的格式字符串和参数类型不匹配 - 因此结果是未定义的行为(u)r。
1 未转换为 1.0 的原因printf
是“只是”一个具有可变数量参数的 C 函数,并且只有第一个(必需)参数具有指定的类型 ( const char *
)。因此编译器“不能”知道它应该转换“额外”参数——它在实际读取格式字符串并确定它应该得到一个浮点数之前被传递。 printf
现在,诚然,您的格式字符串是一个编译时常量,因此编译器可以制作一个特殊情况并printf
警告您有关不正确的参数(并且,正如其他人所提到的,一些编译器会这样做,至少如果您要求他们这样做) . 但在一般情况下,它无法知道任意 vararg 函数使用的具体格式,也可以以复杂的方式(例如在运行时)构造格式字符串。
总而言之,如果您希望将特定类型作为“变量”参数传递,则需要对其进行强制转换。
未定义的行为。一个 int 被视为浮点数
简短的回答是 printf 并不是真正的 C++。Printf 是一个 C 函数,它接受一个变量参数列表,并根据格式字符串中指定的类型将提供的参数应用于格式字符串。
如果您想要任何类型的实际类型检查,您应该使用流和字符串 - 实际 C++ 替代良好的旧 C 样式 printf。
有趣的是,如果你的 put '1.0' 大概没问题
我想 printf 只获取变量的地址,它无法知道它是什么。但我原以为编译器会礼貌地警告你。