C宏和括号中的参数使用例#define Echo(a) a
#define Echo(a) (a)我意识到这里可能没有显着差异,但为什么你想要a在宏体内包括括号内?它是如何改变它的?
2 回答
婷婷同学_
TA贡献1844条经验 获得超8个赞
仅仅为了记录,我从这里登陆如何在使用宏时修复数学错误,我将尝试在此处扩展此答案以适应其他人。
你在询问有关的区别:
#define Echo( a ) a#define Echo( a ) ( a )
只要你不了解自己的宏(我也不是专家:)这是好的。
首先,您已经(可能)知道存在运算符优先级,因此这两个程序存在巨大差异:
1):
#include <stdio.h>#define ADD( a , b ) a + bint main( void ){ auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 2 + b ); printf( "%d", c ); return 0;}
输出:
19
和:
#include <stdio.h>#define ADD( a , b ) ( a ) + ( b )int main( void ){ auto const int a = 5; auto const int b = 10; auto const int c = ADD ( a , b ); printf( "%d", c ); return 0;}
输出:
15
现在,让我们preplace +
有*
:
#define ADD( a, b ) a * b
编译器对待a * b
例如a == 5
,b == 10
哪个做5 * 10
。
但是,当你说: ADD ( 2 + a * 5 + b )
喜欢这里:
#include <stdio.h>#define ADD( a , b ) ( a ) * ( b )int main( void ){ auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 5 + b ); printf( "%d", c ); return 0;}
你得到105
,因为涉及运营商优先权并对待
2 + b * 5 + a
如
( 2 + 5 ) * ( 5 + 10 )
是的
( 7 ) * ( 15 )
== 105
但是当你这样做时:
#include <stdio.h>#define ADD( a, b ) a * bint main( void ){ auto const int a = 5; auto const int b = 10; auto const int c = ADD ( 2 + a , 5 + b ); printf( "%d", c ); return 0;}
你得到的37
是因为
2 + 5 * 5 + 10
意思是:
2 + ( 5 * 5 ) + 10
意思是:
2 + 25 + 10
简短的回答,有一个很大的区别:
#define ADD( a , b ) a * b
和
#define ADD( a , b ) ( a ) * ( a )
- 2 回答
- 0 关注
- 504 浏览
添加回答
举报
0/150
提交
取消