考虑以下代码:
#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)。为什么不是呢?
发布于 2015-08-18 16:04:37
这是因为&的优先比加法+运算符低。操作数的分组将作为
int b = ( (2*a + a) & a ); 因此,(2*a + a) = 3和3 & 1 = 1 (011 & 001 = 001)。
发布于 2015-08-18 16:03:57
因此,正如您已经注意到的,在您的操作中没有优先级(它只是一个文本替代),
#define P1(x) x+x
#define P2(x) 2*P1(x)
int a = P1(1) ? 1 : 0; // 1既然& 有较低优先权而不是+,它就相当于
int b = ((2 * a) + a) & a;也就是说,在b上只设置了最右边的位。
((2 * a) + a) 011 &
a 001 =
--------------------
b 001https://stackoverflow.com/questions/32077208
复制相似问题