一道关于宏的面试题及解答

题目:

#include<iostream>
using namespace std;

#define SQR(X) X*X

int main(void)
{
	int a = 10;
	int k = 2;
	int m = 1;

	a /= SQR(k+m)/SQR(k+m);
	printf("%d\n",a);

	return 0;
}
这道题目的结果是什么啊?

     【解答】
典型错误1:
SQR(k+m)/SQR(k+m) = 1;
最后得到a = 10;
原因:#define 只是宏定义而已,在编译前会将#define定义的内容进行替换,然后进行编译。这一点与函数大不相同。结果认为是10,很可能将SQR这个宏定义当作函数来用了。

典型错误2:
进行宏替换,得:
a   /=   (k+m)*(k+m)/(k+m)*(k+m);
=> a   /=   (k+m)*1*(k+m);
=> a   =   a/9;
=> a   =   1;

原因:宏替换是按照宏定义进行的严格不变的替换,所以上面的替换结果应该为:
a   /=   k+m*k+m/k+m*k+m;
=> a /= 2+1*2+1/2+1*2+2;
=> a /= 7;
=> a = 1;


【评析】
该题目主要考查两点:
1、慎用宏定义,如果需要用宏,考虑是否可以通过函数、模板、或const定义等代替之。例如本题,使用函数实现可以轻松避免以上问题。
2、宏定义的方式:在所有参数上一定要加括号。本题中#define SQR(X) X*X 就属于不良风格的宏定义方式,良好的风格应该为:#define SQR(X) (X)*(X),这样,计算的结果就是a   /=   (k+m)*(k+m)/(k+m)*(k+m),最后结果仍为1。或者定义为:#define SQR(X) ((X)*(X)),这样最后的结果是10。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值