一道C++题目,求详解

对于以下宏定义:#defineM(x)x*x#defineN(x,y)M(x)+M(y)宏调用N(2,2+5)执行后,值为AA.21B.53C.19D.51... 对于以下宏定义:#define M(x) x*x #define N(x,y) M(x)+M(y)
宏调用N(2,2+5)执行后,值为A
A.21
B. 53
C. 19
D. 51
展开
 我来答
百度网友d81e93d
2013-12-27 · TA获得超过331个赞
知道答主
回答量:28
采纳率:0%
帮助的人:40.4万
展开全部
直接代入即可,N(2, 2 + 5) = M(2) + M(2 + 5) = 2 * 2 + 2 + 5 * 2 + 5 = 21

这道题主要是考的宏调处时,编译器是怎么处理的。
编译器在这里只做简单的替换,不会给你自动加括号。

所以一般在用宏定义时,最好加上括号,才能得到想要的结果。
这这道题改成如下形式,
#define M(x) (x*x)
#define N(x,y) (M(x)+M(y))
便是写宏定义的规范形式。
追问
2 + 5 * 2 + 5 这个是怎么来的?
追答
代入即可,我给你对应起来,你看看能不能理解,
主要的问题是
#define M(x) = x*x
如果x = 2+5
我们将x”直接取代“为2+5,便有如下形式
M( x ) = x * x
M(2 + 5) = 2+5 * 2+5
以上这个等式如果能理解的话,
我们再来看一下 + 与 * 的优先级,明显 * 的优先级比 + 的优先级别高,
所以C语言先作了*法,最后再计算了另外两个+法
便有了
M(2 + 5) = 2 + 5 * 2 + 5 = 17

想避免这种情况的发生,就得使用括号()来把x括起来
如果写成如下形式
#define M(x) = (x)*(x)
我们再作取代
M( x ) = ( x ) * ( x )
M(2 + 5) = (2 + 5) * (2 + 5) = 49
scc172fly
2013-12-27 · TA获得超过193个赞
知道小有建树答主
回答量:259
采纳率:0%
帮助的人:108万
展开全部
宏定义可以把他想像成字符串。很多书也这么说!那么这个宏展开最终是这样的:2*2 2 5*2 5,计算得:21!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2013-12-27 · TA获得超过110个赞
知道答主
回答量:17
采纳率:0%
帮助的人:20.6万
展开全部
程序中调用宏时,是把变量全部替换,然后再进行计算,如下:
N(2,2+5)= M(2) + M(2+5) = 2*2 + 2+5*2+5 = 21
追问
2*2 + 2+5*2+5 怎么来的
追答
#define  M(x) x*x 
#define N(x,y) M(x)+M(y)

N(2,2+5)= M(2) + M(2+5) 注:N(x,y)的x=2;y=2+5
M(2) 注:x=2;
M(2+5) 注:x=2+5
直接以数字代替x得出:
M(2) + M(2+5) =2*2 + 2+5*2+5 = 21
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
上帝粒子1号
2013-12-27 · 超过11用户采纳过TA的回答
知道答主
回答量:47
采纳率:0%
帮助的人:27.1万
展开全部
A 21,直接代换
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式