1. printf函数使用公式
在前几篇文章中,我们已经使用过很多次printf
函数了。
这一节,我们先复习一下printf
的使用公式,然后再来详细讨论一下它。
printf
函数的使用公式:
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;
}
让我们从以下5点详细分析一下printf
的用法:
printf
是一个变参函数。(参数的数量和类型不确定)printf
的第一个参数是字符串。printf
的第一个参数是需要输出的字符以及需要被替换的占位符。printf
的第二及后续参数将依次替换占位符。- 占位符的类型和数量需要与后续的参数类型和数量对应。
1.1 printf是一个变参函数
关于printf
是一个变参函数的事实,我们在前面对printf
的使用中,已经充分验证过了。
它的参数个数是不确定的,同时参数类型也是不确定的。
printf("%d", 1); // 两个参数
printf("%d %f", 1, 2.3); // 三个参数
printf("%d %f %c", 1, 2.3, 'H'); // 四个参数
1.2 第一个参数必须字符串
1.3 第一个参数包含需要输出的字符以及需要被替换的占位符
这个字符串包含了需要输出的字符,以及需要被替换的占位符。
1.4 第二及后续参数将依次替换占位符
1.5 占位符的类型和数量需要与后续的参数类型和数量对应
2. 整型类型的占位符
在前面的printf
函数的使用当中,我们一直将%d
作为整型int
类型的占位符。对于其他的整型类型,它们的占位符分别都是什么呢?
printf
是一个可变参数函数,在C语言中将参数传入函数的可变参数中,变量会发生自动类型提升。
2.1 有符号整型的类型提升
对于有符号位的整型char
,short
,传入printf
的可变参数时,会被提升为int
。而比int
更高级的整型则不发生变化。
所以,在处理char
,short
,int
时,均可使用%d
来占位。
而在Visual Studio中int
与long
的范围一致,按理来说也可以使用%d
来占位。
但是为了程序的可移植性,在切换到别的平台下时,int
和long
有可能不一致。
所以,请使用%ld
来为long
占位。更高级的long long
则需要使用%lld
来占位。
结论:
char,short,int使用%d
。
long使用%ld
。
long long使用%lld
。
2.2 无符号整型的类型提升
对于无符号位的整型unsigned char
,unsigned short
,传入printf
的可变参数时,会被提升为unsigned int
。
而比unsigned int
更高级的整型则不发生变化。
对于无符号整型,需要将d
替换成u
表明最高位不被看作符号位,而是数据位。
结论:
unsigned char,unsigned short,unsigned int使用%u
。
unsigned long使用%lu
。
unsigned long long使用%llu
。
2.3 浮点类型的类型提升
float
会被提升为double
,double
不发生变化。
结论:
float,double均使用%f
。