#define ABC 20
#define XYZ 10
#define XXX ABC - XYZ
main()
{
int a;
a = XXX * 10;
printf("%d\n", a);
}
我检查了XXX的值为10.那么为什么输出-80?这可能很傻,但我是c编程的新手。
答案 0 :(得分:4)
在您的代码中
a = XXX * 10;
与
相同a = ABC - XYZ * 10;
是
a = 20 - 10 * 10;
答案是20 -100
,-80
。
这就是为什么一般建议在MACRO定义中使用括号。像
这样的东西 #define XXX (ABC - XYZ)
是你期待的。
尽管如此,托管环境中main()
的符合签名至少为int main(void)
。
答案 1 :(得分:1)
这就是预处理器的工作原理。定义不会创建部分表达式或语句。相反,宏实际上被其定义所取代。
因此在
a = XXX * 10;
XXX实际上取代了
ABC - XYZ
结果
a = ABC - XYZ * 10;
由于*
的绑定高于-
,因此
a = ABC - (XYZ * 10);
是-80。
最好至少在宏中用表达式写括号:
#define XXX (ABC - XYZ)