C 宏内宏

C 宏内宏,c,macros,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。为什么不是这样呢?您的操作中没有优先级,它只是一个文本替换,因此,正如您所指出的 #define P1(x) x+x #define P2(x

考虑以下代码:

#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
由于&than+,它相当于

int b = ((2 * a) + a) & a;
i、 e.只有最右边的位设置在b上

这是因为&的值低于加法+运算符的值。操作数分组将按如下方式进行:

int b = ( (2*a + a) & a ); 
因此,2*a+a=3和3&1=1011&001=001

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