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