pirntf()函数心得(笔试后的忏悔)
printf()函数原型:intprintf(const char*format,[argument]);基本用法就不在赘述了,也不讲一步步实现细节,估计很多人都会看不下去,这些网上都有。接下来主要讲的是如何取数打印出来。
首先,来看一个例子(某知名IT公司的笔试题):
test1.c
#include<stdio.h>
intmain()
{
long long a=1;
long long b=2;
long long c=3;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
上面的程序结果是什么?运行后可以看到,结果是:
a=1
b=0
c=2
看到上面的运行结果,很多人第一眼会很诧异,这里我讲讲我的想法,不知道真实情况是不是我想的这样,仅供参考,不对之处,还望指出。
首先先看内存的中的分布情况。
test2.c
#include<iostream>
#include<stdio.h>
usingnamespace std;
intmain()
{
longlong a=1;
longlong b=2;
longlong c=3;
signedint *m;
m= (int *)&a;
for(int i=0; i < 6; i++)
{
if(i % 2 == 0)
printf("\n");
printf("%p=%d ",m+i,*(m+i));
}
printf("\n");
printf("&a=%p\n",&a);
printf("&b=%p\n",&b);
printf("&c=%p\n",&c);
printf("\n");
printf("a=%d,b=%d,c=%d\n",a,b,c);
printf("a=%lld,b=%d,c=%d\n",a,b,c);
printf("a=%d,b=%lld,c=%d\n",a,b,c);
printf("a=%d,b=%lld,c=%lld\n",a,b,c);
printf("\n\n\n");
longlong n = 8589934592;
int*Ln;
Ln= (int *)&n;
printf("%lld的高字节内容为:%d\n",n,*(Ln+1));
printf("%lld的低字节内容为:%d\n",n,*Ln);
return0;
}
运行结果:
由上面的程序运行结果可知,数据在内存中的分布如下:
地址
存的内容
0xbffa88c0
1
0xbffa88c4
0
0xbffa88c8
2
0xbffa88cc
0
0xbffa88d0
3
0xbffa88d4
0
printf("a=%d,b=%d,c=%d\n",a,b,c);取的是从地址a开始的前三个字节的内容。首先a=%d,从a开始取一个字节,因为用了”%d”,所以输出1,随后b=%d,是紧跟这上次的地址(0xbffa88c4)后取一个字节,而不是从0xbffa88c8开始取的,我想可能printf只获取第二个参数(本例子中的a)的地址,然后根据格式(%d)所代表的长度来取值,而不在乎其后b,c的值是多少,只要有这个参数就行。
为了验证以上想法,我们再来看
printf("a=%lld,b=%d,c=%d\n",a,b,c);很容易知道符合以上想法的。
printf("a=%d,b=%lld,c=%d\n",a,b,c);首先a取了第一个字节即1输出,而后b取从0xbffa88c4到0xbffa88c8的内容,并且本机器是小尾端体系结构,即低地址存低字节,高低值存高字节,比如inta = 0x1234;低地址存的内容是0x34,高字节存的内容是0x12。所以输出结果是8589934592。
printf("a=%d,b=%lld,c=%lld\n",a,b,c);的输出结果同理分析。
补充:综合编程 , 其他综合 ,