使用'define'的规则

时间:2016-01-25 12:30:11

标签: c

为什么b 1

#define P1(x) x+x
#define P2(x) 2*P1(x)
int a=P1(1)?1:0;
int b=P2(a)&a;

我只是尝试输入1,对我来说似乎返回b = 0,是否有 #define 的规则?难道他们不能在c中扮演函数吗?

2 个答案:

答案 0 :(得分:1)

宏仅仅是文本替换。扩展您的代码,您将得到:

int a=1+1?1:0;
int b=2*a+a&a;

注意完全且完全没有括号,这是由于宏缺少适当的括号引起的。

1+1是一个非零值,因此a将为1。

因此,{p> b将为2*1+1&1。遵循C中的运算符优先级规则,*在表达式中具有最高优先级,后跟+,后跟&,后跟优先级最低的=

所以表达式相当于:b = ( ( (2*1) + 1) & 1);

2*1 == 22+1==33 & 1 == 1

答案 1 :(得分:1)

#define P1(x) x+x
#define P2(x) 2*P1(x)
int a=P1(1)?1:0;
int b=P2(a)&a;
代码替换后,它将如下所示:

int a=1+1?1:0;
int b=2*a+a&a;

由于1+1不是falsea将是1,所以:

int b=2*1+1&1 

为了清晰起见,我将用括号(见operator precedence):

写出来
int b=((2*1)+1)&1

相当于:

int b=3&1 

相当于:

int b=0b0011 & 0b0001 

相当于:

int b=0b0001 

表示b=1