[英]Implicit conversion in 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只获取变量的地址,它无法知道它是什么。 但我原本以为编译器会有礼貌警告你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.