C中的隐式转换?

这里发生了什么:

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

输出:

 result = 1 result = 0.000000 

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

在第二种情况下,您的格式字符串和参数类型不匹配 – 因此结果是未定义的行为(u)r。

1未转换为1.0的原因是printf “只是”具有可变数量参数的C函数,并且只有第一个(必需)参数具有指定类型( const char * )。 因此编译器“不能”知道它应该转换“额外”参数 – 它 printf实际读取格式字符串并确定它应该获得浮点数之前传递。

现在,诚然,你的格式字符串是一个编译时常量,因此编译器可以在printf创建一个特殊情况警告你不正确的参数(并且正如其他人所提到的,一些编译器会这样做,至少如果你要求它们)。 但是在一般情况下,它不能知道任意vararg函数使用的特定格式,并且还可以以复杂的方式构造格式字符串(例如,在运行时)。

总而言之,如果您希望将特定类型作为“变量”参数传递,则需要强制转换它。

未定义的行为。 int被视为float

简短的回答是printf不是真正的C ++。 Printf是一个C函数,它接受一个变量参数列表,并将提供的参数应用于格式字符串,以及格式字符串中指定的类型。

如果你想要任何类型的实际类型检查,你应该使用流和字符串 – 实际的C ++替代旧的C风格printf。

有趣的是,如果你把’1.0’放在一边很好

我想printf只获取变量的地址,它无法知道它是什么。 但我原本以为编译器会有礼貌警告你。