最近准备面试找工作,开始刷一些c语言的题目,本来觉得没什么意思,但是后面看到一些比较有趣的题目觉得还是挺有用的,用一个博客来记录所有遇到比较特别的题目。
关于宏定义的题目
#define SQR(x) (x*x)
int main(void)
{
int a,b = 3;
a = SQR(b+2);
printf("%d",a);
return 0;
}
A.11 B.25 C.不确定 D.程序错误
问这个结果是多少。
一开始我直接把b+3计算出结果之后,平方的结果。但是不确定,觉得没那么简单,在网上找答案后发现答案是 A
我一开始以为这个解析是SQR只是将后面的变量值作为了x的值,这样的话应该是b*b+2=11。
后面在网上查解释,我竟忘了其实define是一个非常简单的操作,单纯的扫描整个程序代码,将对应符合SQR(x)的语句直接替换为(x*x)。这种替换非常直接,直接到就连个括号都不会加,所以替换之后的表达式应该是(b+2*b+2)
为验证代码我将2改成了3,最后输出的结果为(b+3*b+3)=15。
定义一个结构体,需4字节对齐,应填入V1、V2、V3、V4、V5、V6的值为。
#define PADS(x,y) char pad##x[y]
typedef struct
{
short a;
PADS(V1,V2);
char b[3];
PADS(V3,V4);
char *p;
PADS(V5,V6);
}ST_TEST
A. 0,1,0,4,0,0
B. 1,2,3,4,5,6
C. 100,2,1234,1,0,0
D. 1,2,3,7,1,12
这道题在网上查了,没有找到最后的答案。题目也不是很清晰,最后根据字节对齐,感觉答案是C
首先是宏定义是直接将对应的字符或者字符串替换成对应设置的值。替换之后的结果应该是
typedef struct
{
short a;
char pad##V1[V2];
char b[3];
char pad##V3[V4];
char *p;
char pad##V5[V6];
}ST_TEST
pad##这个没哟接触过但是看替换结果应该是一个变量名,结构体内的变量名不能重复,所以V1、V3、V5只要不相等的话任意值都可以。所以A、D排除。
接下来是字节对齐,我这里认为四字节对其是用char进行填补空位,short为2字节,需要补两位,所以V2为2。以此类推,V4为1,V6为0。之所以V6为0的原因是,指针在没有赋值的时候,所占的空间应该为0。
因为网上没有对应的答案,所以这里只是自己的判断,如果有正确答案的朋友欢迎来信息,相互讨论一下。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
今天对这道题目进行了验证。我将B、C的答案分别输入到程序中运行,结果分别为32、16。这和我想象中的不太一样,有些出入,我算的结果觉得应该是12。
我就分别注释掉每个字节段,去验证,发现指针是占用了8字节的(我的系统是64位),所以V5、V6的确是0,但是解释不太一样,指针是占用空间的,只不过指针占用的空间是固定的,并且与系统平台有关,基本都是4的倍数。所以答案还是C只不过前面的额解释有些问题。