关于C/C++宏的笔试题

本文通过一道关于C++宏定义的题目,详细解析了宏定义的运算规则,并澄清了网络上的错误理解。揭示了宏定义在编译时的替换过程及复合赋值运算符的优先级。

     前些天去参加一个笔试,其中有一个关于C++带参数的宏的题目,题目是这样的:

#define SQR(X) X*X

void main()
{
 int a = 10;
 int k = 2;
 int m = 1;
 a/=SQR(k+m)/SQR(k+m);
 cout<< a<<endl;
}  
要求写出结果。

 

   当时我的解法是参数的简单替换a=a/k+m*k+m/k+m*k+m得到a的值为10,但后来在VC++上运行的结果是1。

   我就想,难道是我对带参数宏的理解错误?在搜索引擎上搜索了很多相关的信息,发现搜索出来的一个错误解释能得出正确的结果,大量的转载让人把谎言误以为是真理,我也因此变得更加迷惑。网上转载的解释是:

在编译时,只是简单的代换X*X,

a /= (k+m)*(k+m)/(k+m)*(k+m)
=>a /= (k+m)*1*(k+m)
=>a = a/9
=>a = 1

但如果测试SQR(k+m)的值为5而非9,经过了几组数据的测试和查阅资料总结如下:

第一,带参数的宏定义的一般形式如下:#define <宏名>(<参数表> <宏体>,如果我们把宏定义时出现的参数视为形参,而在程序中引用宏定义时出现的参数视为实参,在宏替换时,就是用实参来替换<宏体>中的形参。SQR(k+m)/SQR(k+m)预编译后为 k+m*k+m/k+m*k+m。

第二,op= 形式的操作符(如 += , -= , *= , /= , %= , <<= , >>= , &= ^= , |= )为“符合赋值操作符”具有低优先级。

那么a/=SQR(k+m)/SQR(k+m)=>a /= k+m*k+m/k+m*k+m => a /= 7 =>a = a/7 =>a = 1; 得出正确的结果。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值