当前位置:编程学习 > 网站相关 >>

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);的输出结果同理分析。

 

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,