请考虑以下代码:
#define P1(x) x+x
#define P2(x) 2*P1(x)
int main()
{
int a = P1(1) ? 1 : 0;
int b = P2(a)&a;
return 0;
}
现在,我认为编译器首先用它们的值替换宏,因此int b = 2*a+a&a;
(以及a=1
然后b=3
)。为什么不这样呢?
答案 0 :(得分:2)
您的操作没有优先权(只是文字替代)因此,正如您所指出的那样,
#define P1(x) x+x
#define P2(x) 2*P1(x)
int a = P1(1) ? 1 : 0; // 1
从&
has lower precedence开始,而不是+
,相当于
int b = ((2 * a) + a) & a;
即。只在b
上设置了最右边的位。
((2 * a) + a) 011 &
a 001 =
--------------------
b 001
答案 1 :(得分:2)
这是因为&
的{{3}}比+
运算符低precedence。操作数的分组将作为
int b = ( (2*a + a) & a );
因此,(2*a + a) = 3
和3 & 1 = 1
(011 & 001 = 001
)。