C中的隐式转换?

时间:2010-11-16 20:53:17

标签: c implicit-conversion

这里发生了什么:

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

输出:

result = 1
result = 0.000000

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

5 个答案:

答案 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只获取变量的地址,它无法知道它是什么。但我本以为编译器会有礼貌的警告你。