仅仅为了记录,我从这里登陆如何在使用宏时修复数学错误,我将尝试在此处扩展此答案以适应其他人。
你在询问有关的区别:#define Echo( a ) a#define Echo( a ) ( a )
只要你不了解自己的宏(我也不是专家:)这是好的。
首先,您已经(可能)知道存在运算符优先级,因此这两个程序存在巨大差异:
1):#include #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 #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 #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 #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 )