前言
printf可能是我们在学习C语言的过程中最早接触的库函数了。其基本使用想必我们都已经非常清楚了。但是下面的这些情况你是否已经清楚地知道了呢?
示例程序
我们来看一个示例程序,看看你能否对下面的结果输出有非常清晰的认识。
#include <stdio.h>
int main(void)
{
int a = 4;
int b = 3;
int c = a/b;
float d = *(float*)(&c);
long long e = 0xffffffffffffffff;
printf("a/b:%f,a:%d\n",a/b,a,b); //打印0
printf("(float)a/b:%f\n",((float)a)/b); //打印1
printf("(double)a/b:%lf\n",((double)a)/b);//打印2
printf("d:%f\n",d); //打印3
printf("%.*f\n",20,(double)a/b); //打印4
printf("e:%d,a:%d\n",e,a); //打印5
printf("a:%d,++a:%d,a++:%d\n",a,++a,a++); //打印6
return 0;
}
编译为32位程序:
gcc -m32 -o test test.c
在运行之前,你可以自己先猜想一下打印结果会是什么。实际运行结果:
a/b:0.000000,a:3 //打印0的结果
(float)a/b:1.333333 //打印1的结果
(double)a/b:1.333333 //打印2的结果
d:0.000000 //打印3的结果
1.33333333333333325932 //打印4的结果
e:-1,a:-1 //打印5的结果
a:6,++a:6,a++:4 //打印6的结果
你的猜想是否都正确呢?如果猜想错误,那么接下来的内容你就不应该错过了。
你是否会有以下疑问:
-
0.打印0的a/b为什么不是1,a为什么不是4?
-
1.打印1和打印2有什么区别呢?
-
2.打印3为什么结果会是0.000000?
-
3.打印4的结果为什么最后的小数位不对?其中的*是什么意思?
-
4.打印5中,为什么a的值是-1而不是4?
-
5.打印6中,结果为什么分别是6,6,4?
在解答这些问题之前,我们需要先了解一些基本内容。
可变参数中的类型提升
printf是接受变长参数的函数,传入pr