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 );