一道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 展开
宏调用N(2,2+5)执行后,值为A
A.21
B. 53
C. 19
D. 51 展开
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))
便是写宏定义的规范形式。
这道题主要是考的宏调处时,编译器是怎么处理的。
编译器在这里只做简单的替换,不会给你自动加括号。
所以一般在用宏定义时,最好加上括号,才能得到想要的结果。
这这道题改成如下形式,
#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
展开全部
宏定义可以把他想像成字符串。很多书也这么说!那么这个宏展开最终是这样的:2*2 2 5*2 5,计算得:21!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序中调用宏时,是把变量全部替换,然后再进行计算,如下:
N(2,2+5)= M(2) + M(2+5) = 2*2 + 2+5*2+5 = 21
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
A 21,直接代换
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询