知识点一:printf函数使用公式
1)printf("XXX占位1 XXX 占位2 XXX占位3", 替换1, 替换2, 替换3);
例:
-
#include <stdio.h>
-
int main()
-
{
-
int a =
1;
-
float b =
2.345;
-
char c =
'a';
-
printf(
"整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);
-
return
0;
-
}
知识点二:printf函数用法
1)printf 是一个变参函数。(参数的数量和类型不确定);
a)它的参数个数是不确定的,同时参数类型也是不确定的;
-
printf(
"%d",
1);
// 两个参数
-
printf(
"%d %f",
1,
2.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;
-
#include <stdio.h>
-
int main()
-
{
-
char c1 =
127;
-
short s1 =
32767;
-
int n1 =
2147483647;
-
char c2 =
-128;
-
short s2 =
-32768;
-
int n2 =
-2147483648;
-
printf(
"%d\n", c1);
-
printf(
"%d\n", s1);
-
printf(
"%d\n", n1);
-
printf(
"%d\n", c2);
-
printf(
"%d\n", s2);
-
printf(
"%d\n", n2);
-
return
0;
-
}
变量c1,s1,c2,s2均为比int低级的整型类型。它们在进入printf时会转换为int。因此使用转换操作d, 取sizeof(int)字节二进制数据,并将它们按照有符号整型转换为字符并打印在控制台上;
2)转换操作u;
-
#include <stdio.h>
-
int main()
-
{
-
unsigned
char c1 =
0;
-
unsigned
short s1 =
0;
-
unsigned
int n1 =
0;
-
unsigned
char c2 =
255;
-
unsigned
short s2 =
65535;
-
unsigned
int n2 =
4294967295;
-
printf(
"%u\n", c1);
-
printf(
"%u\n", s1);
-
printf(
"%u\n", n1);
-
printf(
"%u\n", c2);
-
printf(
"%u\n", s2);
-
printf(
"%u\n", n2);
-
return
0;
-
}
变量c1,s1,c2,s2均为比unsigned int低级的整型类型。它们在进入printf时会转换为unsigned int。 因此使用转换操作u,取sizeof(unsigned int)字节二进制数据,并将它们按照无符号整型转换为字符并 打印在控制台上;
3)误用转换操作d与u,由于有符号整型int与无符号整型int的取值范围不一致,数据类型与转换操作错误搭配很有可能造成错误 的转换结果;
4)转换操作c;
-
#include <stdio.h>
-
int main()
-
{
-
char c =
65;
-
short s =
66;
-
int n =
67;
-
printf(
"c=%d\n", c);
-
printf(
"s=%d\n", s);
-
printf(
"n=%d\n", n);
-
printf(
"c=%c\n", c);
-
printf(
"s=%c\n", s);
-
printf(
"n=%c\n", n);
-
return
0;
-
}
变量c,s,n 为比int低级或等于的整型类型。它们在进入printf时会转换为int。因此使用转换操作c,取 sizeof(int) 字节二进制数据,将数值转换为数值对应的ASCII字符并打印在控制台上。
5)转换操作f,e,E;
-
#include <stdio.h>
-
int main()
-
{
-
float f =
1.234;
-
double df =
1.234567;
-
printf(
"%f\n", f);
-
printf(
"%f\n", df);
-
return
0;
-
}
变量f, df 为比double低级或等于的整型类型。它们在进入printf时会转换为double。因此使用转换操作 f,取 sizeof(double) 字节二进制数据,并将它们按照双精度浮点型转换为字符并打印在控制台上。
-
#include <stdio.h>
-
int main()
-
{
-
float f =
1.234;
-
double df =
1.234567;
-
printf(
"%e\n", f);
-
printf(
"%e\n", df);
-
printf(
"%E\n", f);
-
printf(
"%E\n", df);
-
return
0;
-
}
转换操作e,E与f类似,但是使用e计数法。e与E的区别为,一个使用小写e,一个使用大写E。
6)转换操作o,x,X;
-
#include <stdio.h>
-
int main()
-
{
-
unsigned
int n =
123456;
-
printf(
"%u\n", n);
// 十进制
-
printf(
"%o\n", n);
// 八进制
-
printf(
"%x\n", n);
// 十六进制,小写字母
-
printf(
"%X\n", n);
// 十六进制,大写字母
-
return
0;
-
}
a)o,x,X 转换操作,将获取sizeof(unsigned int)字节二进制数据;
b)o将数据按照无符号整型转换为八进制字符并打印在控制台上;
c)x,X将数据按照无符号整型转换为十六进制字符并打印在控制台上;
d)x与X的不同在于,一个使用小写字母,一个使用大写字母;
7)转换操作s;
-
#include <stdio.h>
-
int main()
-
{
-
printf(
"%s",
"Hello World\n");
-
return
0;
-
}
s转换操作,将获取 sizeof(char *) 字节二进制数据,并将这个数据看作字符串首地址,从首地址开始,输出这串字符串。