Abh*_*eet 2 c side-effects operator-precedence c-preprocessor
#include<stdio.h>
#include<conio.h>
#define ABC 20
#define XYZ 10
#define XXX ABC - XYZ
void main()
{
int a;
a = XXX * 10;
printf("\n %d \n", a);
getch();
}
Run Code Online (Sandbox Code Playgroud)
我认为输出应该是100但是当我看到结果时我发现输出为-80.当我把括号作为#define XXX (ABC-XYZ)然后我输出为100但没有括号我输出为-80.
Tho*_*mas 13
预处理器是一个愚蠢的野兽.它在纯文本级别上工作,而不考虑它在语义上对代码所做的事情.让我们看看它在这种情况下的作用:
a = XXX * 10;
Run Code Online (Sandbox Code Playgroud)
变
a = ABC - XYZ * 10;
Run Code Online (Sandbox Code Playgroud)
变成了
a = 20 - 10 * 10;
Run Code Online (Sandbox Code Playgroud)
显然,这是-80.
可能是什么意思
#define XXX (ABC - XYZ)
Run Code Online (Sandbox Code Playgroud)
这就是为什么宏被认为是邪恶的一个原因.