宏内宏

时间:2015-08-18 15:58:29

标签: c macros

请考虑以下代码:

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

2 个答案:

答案 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) = 33 & 1 = 1011 & 001 = 001)。

相关问题