以下程序为什么给出-80作为输出?

时间:2016-11-30 14:09:00

标签: c c-preprocessor

    #define ABC 20
#define XYZ 10
#define XXX ABC - XYZ

main()
{
int     a;
a = XXX * 10;
printf("%d\n", a);
}

我检查了XXX的值为10.那么为什么输出-80?这可能很傻,但我是c编程的新手。

2 个答案:

答案 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)