为了记录,我从这里How to fix mathematical errors while using macros 登陆,我会尝试在这里扩展这个答案以适应另一个。
你问的是关于以下方面的区别:
#define Echo( a ) a
#define Echo( a ) ( a )
只要你不理解它自己的宏就可以了(我也不是专家:))。
首先你已经(可能)知道有运算符优先级,所以这两个程序有很大的不同:
1):
#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 , 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
现在让+ 替换为*:
#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 * 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;
}
你得到37是因为
2 + 5 * 5 + 10
意思是:
2 + ( 5 * 5 ) + 10
意思是:
2 + 25 + 10
简短的回答,有很大的区别:
#define ADD( a , b ) a * b
和
#define ADD( a , b ) ( a ) * ( a )