问题在执行下列代码时发现的
int main()
... {
int a =1;
float b = 1.0;
float c = a/10;
printf("%d ", (int)(b));
printf("%d " , b );//问题一:为什么不一样啊, 用%d输出b不是一次类型转换?
//这个更奇怪了,为什么,只是把第一个%d该成%f,后面的也会发生变化?
printf("%d , %f , %f ", a/10 , b/10, c );
printf("%f , %f , %f ", a/10 , b/10, c );
getch();
return 0;
}
int main()
... {
int a =1;
float b = 1.0;
float c = a/10;
printf("%d ", (int)(b));
printf("%d " , b );//问题一:为什么不一样啊, 用%d输出b不是一次类型转换?
//这个更奇怪了,为什么,只是把第一个%d该成%f,后面的也会发生变化?
printf("%d , %f , %f ", a/10 , b/10, c );
printf("%f , %f , %f ", a/10 , b/10, c );
getch();
return 0;
}
这些问题涉及到了c语言库中printf()的具体实现.
这里不列出printf()的具体实现代码,你可以搜索一下,很多的
我们需要知道的有以下几点:
1 printf()是这样定义的一个函数
int _Cdecl printf (const char *format, ...)
可以看到这里使用了一个字符指针format来接受可变参数,这就是我们可以输出不同数量数据的原因
2 当printf处理这个可变参数时(实际是个字符串),首先扫描%d,%f,/n之类的东西,其他的东西就放
过,照样输出.而对这些扫描到的敏感字符(%d之类的),通过一个大的switch类处理.
switch(ch)
{
case 'd' :.................
case 'f':....................
........................
}
3 假如我们参数中有%d,那么进入switch是怎么实现的呢?printf()是一位位的取下来处理,比如10,
就是把10的机内码0000 0000 0000 1010一个bit一个bit的取下来处理,所以不存在转换问题,即上述
的问题一,printf()并不知道怎么把一个float型的参数转换成int型再来处理。
4 对于问题二,不太清楚内部是怎么具体是怎么出理的,大体上说就是第二个printf的第一个输出项,
a/10 == 0 是一个整数。将整型a/10=0、float b/10=0.100000、c=0.000000全部按float输出,* 格式化
输出导致数据错位
欢迎查看我马上要发的另一篇关于printf实现的文章