这里发生了什么:
printf("result = %d\n", 1);
printf("result = %f\n", 1);
输出:
result = 1
result = 0.000000
如果我在尝试打印它们之前确保这些变量的类型,它当然可以正常工作。为什么第二个print语句没有被隐式转换为1.00000?
答案 0 :(得分:8)
在第二种情况下,您的格式字符串与参数类型不匹配 - 因此结果是未定义的行为(u)r。
答案 1 :(得分:4)
1未转换为1.0的原因是printf
“只是”具有可变数量参数的C函数,并且只有第一个(必需)参数具有指定类型({{1} })。因此编译器“不能”知道它应该转换“额外”参数 - 它在 const char *
实际读取格式字符串并确定它应该获得浮点数之前传递。
现在,诚然,您的格式字符串是编译时常量,因此编译器可以从printf
中生成特殊情况并且警告您不正确参数(并且正如其他人所提到的,一些编译器会这样做,至少如果你要求它们)。但在一般情况下,它无法知道任意vararg函数使用的特定格式,并且还可以以复杂的方式构造格式字符串(例如,在运行时)。
总而言之,如果您希望将特定类型作为“变量”参数传递,您需要将其强制转换。
答案 2 :(得分:2)
未定义的行为。 int被视为float
答案 3 :(得分:1)
简短的回答是printf不是真正的C ++。 Printf是一个C函数,它接受一个变量参数列表,并将提供的参数应用于格式字符串,格式字符串中指定的类型。
如果你想要任何类型的实际类型检查,你应该使用流和字符串 - 实际的C ++替代旧的C风格printf。
答案 4 :(得分:0)
有趣的是,如果你把'1.0'
,可能会很好我认为printf只获取变量的地址,它无法知道它是什么。但我本以为编译器会有礼貌的警告你。