C宏和括号中的参数使用

C宏和括号中的参数使用

#define Echo(a)  a
#define Echo(a) (a)

我意识到这里可能没有显着差异,但为什么你想要a在宏体内包括括号内?它是如何改变它的?


牧羊人nacy
浏览 505回答 2
2回答

临摹微笑

假设你有#define mul(x, y)  x * y如果我说:mul(a + 5, 6); /* a + 5 * 6 */现在,如果我轻松改变宏:#define mul(x, y)  ((x) * (y))mul(a + 5, 6); /* ((a + 5) * (6)) */请记住,不会评估参数或任何内容,只会执行文本替换。编辑有关在括号中包含整个宏的说明,请参阅Nate CK发布的链接。

婷婷同学_

仅仅为了记录,我从这里登陆如何在使用宏时修复数学错误,我将尝试在此处扩展此答案以适应其他人。你在询问有关的区别:#define&nbsp;Echo(&nbsp;a&nbsp;)&nbsp;&nbsp;a#define&nbsp;Echo(&nbsp;a&nbsp;)&nbsp;(&nbsp;a&nbsp;)只要你不了解自己的宏(我也不是专家:)这是好的。首先,您已经(可能)知道存在运算符优先级,因此这两个程序存在巨大差异:1):#include&nbsp;<stdio.h>#define&nbsp;ADD(&nbsp;a&nbsp;,&nbsp;b&nbsp;)&nbsp;a&nbsp;+&nbsp;bint&nbsp;main(&nbsp;void&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;a&nbsp;=&nbsp;5; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;b&nbsp;=&nbsp;10; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;c&nbsp;=&nbsp;ADD&nbsp;(&nbsp;&nbsp;2&nbsp;+&nbsp;a&nbsp;,&nbsp;&nbsp;2&nbsp;+&nbsp;b&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"%d",&nbsp;c&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}输出:19和:#include&nbsp;<stdio.h>#define&nbsp;ADD(&nbsp;a&nbsp;,&nbsp;b&nbsp;)&nbsp;(&nbsp;a&nbsp;)&nbsp;+&nbsp;(&nbsp;b&nbsp;)int&nbsp;main(&nbsp;void&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;a&nbsp;=&nbsp;5; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;b&nbsp;=&nbsp;10; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;c&nbsp;=&nbsp;ADD&nbsp;(&nbsp;a&nbsp;,&nbsp;b&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"%d",&nbsp;c&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}输出:15现在,让我们preplace&nbsp;+有*:#define&nbsp;ADD(&nbsp;a,&nbsp;b&nbsp;)&nbsp;a&nbsp;*&nbsp;b编译器对待a * b例如a == 5,b == 10哪个做5 * 10。但是,当你说:&nbsp;ADD ( 2 + a * 5 + b )&nbsp;喜欢这里:#include&nbsp;<stdio.h>#define&nbsp;ADD(&nbsp;a&nbsp;,&nbsp;b&nbsp;)&nbsp;(&nbsp;a&nbsp;)&nbsp;*&nbsp;(&nbsp;b&nbsp;)int&nbsp;main(&nbsp;void&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;a&nbsp;=&nbsp;5; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;b&nbsp;=&nbsp;10; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;c&nbsp;=&nbsp;ADD&nbsp;(&nbsp;2&nbsp;+&nbsp;a&nbsp;,&nbsp;5&nbsp;+&nbsp;b&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"%d",&nbsp;c&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}你得到105,因为涉及运营商优先权并对待2 + b * 5 + a如( 2 + 5 ) * ( 5 + 10 )是的( 7 ) * &nbsp;( 15 )&nbsp;==&nbsp;105但是当你这样做时:#include&nbsp;<stdio.h>#define&nbsp;ADD(&nbsp;a,&nbsp;b&nbsp;)&nbsp;a&nbsp;*&nbsp;bint&nbsp;main(&nbsp;void&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;a&nbsp;=&nbsp;5; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;b&nbsp;=&nbsp;10; &nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;const&nbsp;int&nbsp;c&nbsp;=&nbsp;ADD&nbsp;(&nbsp;2&nbsp;+&nbsp;a&nbsp;,&nbsp;5&nbsp;+&nbsp;b&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"%d",&nbsp;c&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;}你得到的37是因为&nbsp;2&nbsp;+&nbsp;5&nbsp;*&nbsp;5&nbsp;+&nbsp;10意思是:2&nbsp;+&nbsp;(&nbsp;5&nbsp;*&nbsp;5&nbsp;)&nbsp;+&nbsp;10意思是:2&nbsp;+&nbsp;25&nbsp;+&nbsp;10简短的回答,有一个很大的区别:#define&nbsp;ADD(&nbsp;a&nbsp;,&nbsp;b&nbsp;)&nbsp;a&nbsp;*&nbsp;b和#define&nbsp;ADD(&nbsp;a&nbsp;,&nbsp;b&nbsp;)&nbsp;(&nbsp;a&nbsp;)&nbsp;*&nbsp;(&nbsp;a&nbsp;)
打开App,查看更多内容
随时随地看视频慕课网APP