宏中宏

Macro inside Macro

考虑以下代码:

#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)。为什么不是这样?

您的操作没有优先级(这只是文本替换)因此,正如您所指出的,

#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

这是因为 & 比加法 + 运算符的 precedence 低。操作数分组将发生

int b = ( (2*a + a) & a ); 

因此,(2*a + a) = 33 & 1 = 1 (011 & 001 = 001)。