混淆输出结果
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
要解决您的问题,您可以:
- 改用函数
- 在所有宏定义周围加上括号(始终推荐这样做)
因此您的代码如下所示:
#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)
应该做你的工作。
我只是好奇为什么输出是 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
要解决您的问题,您可以:
- 改用函数
- 在所有宏定义周围加上括号(始终推荐这样做)
因此您的代码如下所示:
#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)
应该做你的工作。