例子
#define Echo(a) a
#define Echo(a) (a)
我意识到这里可能没有显着差异,但你为什么要a
在宏体内包含括号内?它如何改变它?
例子
#define Echo(a) a
#define Echo(a) (a)
我意识到这里可能没有显着差异,但你为什么要a
在宏体内包含括号内?它如何改变它?
只是为了记录,我从这里登陆如何在使用宏时修复数学错误,我将尝试在此处扩展此答案以适合另一个答案。
您正在询问有关以下方面的区别:
#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
likea == 5
和b == 10
which does 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 )