printf函数详细解析

这篇文章详细介绍了C语言中的printf函数,包括其使用方法,如使用占位符%d、%f等进行变量替换,以及不同类型(如整型、浮点型)在printf中的类型提升规则。此外,还讨论了转换规范,如d、u用于有无符号整型,f用于浮点型,以及e、E、o、x、X用于不同进制表示,s用于字符串输出。
摘要由CSDN通过智能技术生成

知识点一:printf函数使用公式

          1)printf("XXX占位1 XXX 占位2 XXX占位3", 替换1, 替换2, 替换3);

例:


  
  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 1;
  5. float b = 2.345;
  6. char c = 'a';
  7. printf( "整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);
  8. return 0;
  9. }

知识点二:printf函数用法

          1)printf 是一个变参函数。(参数的数量和类型不确定);

                a)它的参数个数是不确定的,同时参数类型也是不确定的;


  
  
  1. printf( "%d", 1); // 两个参数
  2. printf( "%d %f", 1, 2.3); // 三个参数
  3. printf( "%d %f %c", 1, 2.3, 'H'); // 四个参数

        2)第一个参数必须字符串;

        3)第一个参数包含需要输出的字符以及需要被替换的占位符;

        4)第二及后续参数将依次替换占位符;

        5)占位符的类型和数量需要与后续的参数类型和数量对应;

知识点三:整型类型的占位符

          1)有符号整型的类型提升。(对于有符号位的整型 char , short ,传入 printf 的可变参数时,会被提升为 int 。而比 int 更高级的 整型则不发生变化);

               a)比int低级会被提升为intl;

               b)在处理 char , short , int 时,均可使用 %d 来占位;

               c)使用 %ld 来为 long 占位。更高级的 long long 则需要使用 %lld 来占位;

结论:char,short,int使用 %d 。 long使用 %ld 。 long long使用 %lld 。

          2)无符号整型的类型提升;

                a)对于无符号位的整型 unsigned char , unsigned short ,传入 printf 的可变参数时,会被提升 为 unsigned int ;

                b)比 unsigned int 更高级的整型则不发生变化;

                c)对于无符号整型,需要将 d 替换成 u 表明最高位不被看作符号位,而是数据位;

结论:unsigned char,unsigned short,unsigned int使用 %u 。 unsigned long使用 %lu 。 unsigned long long使用 %llu。

          3)浮点类型的类型提升;

               a)float 会被提升为 double , double 不发生变化;

结论:float,double均使用 %f。

知识点四:转换规范

          1)转换操作d;


  
  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char c1 = 127;
  5. short s1 = 32767;
  6. int n1 = 2147483647;
  7. char c2 = -128;
  8. short s2 = -32768;
  9. int n2 = -2147483648;
  10. printf( "%d\n", c1);
  11. printf( "%d\n", s1);
  12. printf( "%d\n", n1);
  13. printf( "%d\n", c2);
  14. printf( "%d\n", s2);
  15. printf( "%d\n", n2);
  16. return 0;
  17. }

      变量c1,s1,c2,s2均为比int低级的整型类型。它们在进入printf时会转换为int。因此使用转换操作d, 取sizeof(int)字节二进制数据,并将它们按照有符号整型转换为字符并打印在控制台上;

            2)转换操作u;


  
  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. unsigned char c1 = 0;
  5. unsigned short s1 = 0;
  6. unsigned int n1 = 0;
  7. unsigned char c2 = 255;
  8. unsigned short s2 = 65535;
  9. unsigned int n2 = 4294967295;
  10. printf( "%u\n", c1);
  11. printf( "%u\n", s1);
  12. printf( "%u\n", n1);
  13. printf( "%u\n", c2);
  14. printf( "%u\n", s2);
  15. printf( "%u\n", n2);
  16. return 0;
  17. }

      变量c1,s1,c2,s2均为比unsigned int低级的整型类型。它们在进入printf时会转换为unsigned int。 因此使用转换操作u,取sizeof(unsigned int)字节二进制数据,并将它们按照无符号整型转换为字符并 打印在控制台上;

         3)误用转换操作d与u,由于有符号整型int与无符号整型int的取值范围不一致,数据类型与转换操作错误搭配很有可能造成错误 的转换结果;

         4)转换操作c;


  
  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char c = 65;
  5. short s = 66;
  6. int n = 67;
  7. printf( "c=%d\n", c);
  8. printf( "s=%d\n", s);
  9. printf( "n=%d\n", n);
  10. printf( "c=%c\n", c);
  11. printf( "s=%c\n", s);
  12. printf( "n=%c\n", n);
  13. return 0;
  14. }

       变量c,s,n 为比int低级或等于的整型类型。它们在进入printf时会转换为int。因此使用转换操作c,取 sizeof(int) 字节二进制数据,将数值转换为数值对应的ASCII字符并打印在控制台上。

         5)转换操作f,e,E;


  
  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. float f = 1.234;
  5. double df = 1.234567;
  6. printf( "%f\n", f);
  7. printf( "%f\n", df);
  8. return 0;
  9. }

     变量f, df 为比double低级或等于的整型类型。它们在进入printf时会转换为double。因此使用转换操作 f,取 sizeof(double) 字节二进制数据,并将它们按照双精度浮点型转换为字符并打印在控制台上。


  
  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. float f = 1.234;
  5. double df = 1.234567;
  6. printf( "%e\n", f);
  7. printf( "%e\n", df);
  8. printf( "%E\n", f);
  9. printf( "%E\n", df);
  10. return 0;
  11. }

       转换操作e,E与f类似,但是使用e计数法。e与E的区别为,一个使用小写e,一个使用大写E。

         6)转换操作o,x,X;


  
  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. unsigned int n = 123456;
  5. printf( "%u\n", n); // 十进制
  6. printf( "%o\n", n); // 八进制
  7. printf( "%x\n", n); // 十六进制,小写字母
  8. printf( "%X\n", n); // 十六进制,大写字母
  9. return 0;
  10. }

        a)o,x,X 转换操作,将获取sizeof(unsigned int)字节二进制数据;

        b)o将数据按照无符号整型转换为八进制字符并打印在控制台上;

        c)x,X将数据按照无符号整型转换为十六进制字符并打印在控制台上;

        d)x与X的不同在于,一个使用小写字母,一个使用大写字母;

    7)转换操作s;


  
  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. printf( "%s", "Hello World\n");
  5. return 0;
  6. }

      s转换操作,将获取 sizeof(char *) 字节二进制数据,并将这个数据看作字符串首地址,从首地址开始,输出这串字符串。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值