c - 宏内宏

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

最佳答案

这是因为 &precedence 较低。比加法 + 运算符更有效。操作数的分组将如下进行:

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

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

关于c - 宏内宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32077208/

相关文章:

c - 在 #define 中使用 ({...}) 与 do {...} while(0); ?

c - Linux 消息队列的接收端应该放什么键?

c++ - 是否有可能获得未知类的类成员的数量和类型?

节点的C函数宏

转换时间格式

c++ - C++ 宏可以在 C++ 文件末尾添加一些代码吗?

c - 为什么我不能使用 #if 比较宏和枚举?

c++ - MongoDB C Driver Windows 无法解析的外部符号

c - 如果用户未在 C 中插入默认变量,则分配一个默认变量

c - 从http套接字中提取位置