混淆输出结果

Confusing on output result

我只是好奇为什么输出是 4 而不是 6 。谁能帮忙解释一下他们的过程?

#include <stdio.h>
#define AMT1 a+a+a
#define AMT2 AMT1 - AMT1
main()
{
int a=1;
printf (“Amount is %d\n”,AMT2);
}

谢谢

AMT2 = AMT1 - AMT1
AMT2 = a+a+a - a+a+a
AMT2 = 1+1+1 - 1+1+1
AMT2 = 3 -     1 + 1 + 1
AMT2 = 2         + 1 + 1
AMT2 = 3             + 1
AMT2 = 4

宏的第一条规则是:所有内容都需要括号。你想要:

#define AMT2 (AMT1) - (AMT1)

像这样的宏可以进行文字文本替换。当你编译你的代码时,AMT2 实际上被 AMT1 取代了,所以你实际上是 运行:

printf (“Amount is %d\n”,a+a+a - a+a+a);

您可以通过 运行

查看预处理器的输出(宏被替换后)自己验证这一点
gcc file.c -E

要解决您的问题,您可以:

  1. 改用函数
  2. 在所有宏定义周围加上括号(始终推荐这样做)

因此您的代码如下所示:

#include <stdio.h>

#define AMT1 (a+a+a)
#define AMT2 (AMT1 - AMT1)

int main() {
    int a = 1;
    printf ("Amount is %d\n", AMT2);
}

进行宏替换后,代码变为

printf("Amount is %d\n", 1 + 1 + 1 - 1 + 1 + 1);

加法和减法是左结合的,所以表达式等价于

((((1 + 1) + 1) - 1) + 1) + 1)

如果您希望宏的行为更像变量,则需要将扩展​​括在括号中:

#define AMT1 (a+a+a)
#define AMT2 (AMT1 - AMT1)

简单

AMT2 (AMT1) - (AMT1)

and/or

AMT1 (a+a+a)

应该做你的工作。