关于c语言中printf的几个问题

 
问题在执行下列代码时发现的
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实现的文章
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值