#include<stdio.h>
main()
{
int a = 66;
printf("%f", a);
}
打印0.0000
作为答案,为什么?
%f
已替换为%c
正在打印B
。我没理由。
请解释!!
答案 0 :(得分:5)
这是因为您的程序调用未定义的行为。你可能得到任何预期或意外的东西。
如果转换规范无效,则行为未定义 .335)如果任何参数不是相应转换规范的正确类型,则行为为 未定义。
printf("%f",a);
^ %f specifier expects arguments of type float/ double.
%f被替换为%c它正在打印B.我没有得到原因
字符B
的ASCII代码为66
。使用%c
说明符打印(可打印)字符本身。
答案 1 :(得分:3)
[...]如果任何参数不是相应转换说明符所期望的类型,或者参数少于格式所需的参数,则行为未定义。如果格式需要的参数多于所需的参数,则会评估并忽略无关的参数[...]
虽然,对于%c
,您正确获得了预期的'B'
(ASCII code为66
),但不推荐(传入{{1时成像)因为没有ASCII代码是666
,所以会得到意想不到的结果。至少,您应该事先进行打字:
666
同样,请记住始终对不同类型使用相应的说明符。
答案 2 :(得分:2)
如果使用%f说明符并且不提供浮点数,但是int,则行为未定义。实际上,在int所在位置开始的内存将被解释为float number,因此打印的内容取决于int和float的内部表示。 对于%c,你得到B,因为%c将你的int解释为字符代码,而B的代码是66。
答案 3 :(得分:1)
%f用于打印浮点数 %c用于打印字符 %d用于打印整数
所以当你使用%c printf函数从ascii值转换为B的字符时
如果要打印整数
的printf( “%d”,一);
答案 4 :(得分:0)
%c将与66对应的字符打印到ascii表中。 默认情况下,%f将在小数点后打印5位数,但您可以使用%.3f(3位数)更改行为