有趣的C语言题目

最近准备面试找工作,开始刷一些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只不过前面的额解释有些问题。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值