为什么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中扮演函数吗?
答案 0 :(得分:1)
宏仅仅是文本替换。扩展您的代码,您将得到:
int a=1+1?1:0;
int b=2*a+a&a;
注意完全且完全没有括号,这是由于宏缺少适当的括号引起的。
1+1
是一个非零值,因此a
将为1。
b
将为2*1+1&1
。遵循C中的运算符优先级规则,*
在表达式中具有最高优先级,后跟+
,后跟&
,后跟优先级最低的=
。
所以表达式相当于:b = ( ( (2*1) + 1) & 1);
2*1 == 2
,2+1==3
,3 & 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
不是false
,a
将是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