我试图了解下一次计算是如何执行的。
例如,如果这是我的终端命令
gcc ex2.c -D b+=2
为什么我得到5?
#include <stdio.h>
int main()
{
#ifdef b
printf("%d\n", 2 b | ~ 2 b);
#endif
return 0;
}
2 b表示2 * b?
~2 b意味着2 * b然后〜?
用gcc ex2.c -D b+=2
编译定义b为+2
所以来源
#include <stdio.h>
int main()
{
#ifdef b
printf("%d\n", 2 b | ~ 2 b);
#endif
return 0;
}
就好像
#include <stdio.h>
int main()
{
printf("%d\n", 2 + 2 | ~ 2 + 2);
return 0;
}
对我来说,打印-1
要在预处理后查看结果,请使用选项-E:
/tmp % gcc ex2.c -E -D b+=2
<command-line>: warning: missing whitespace after the macro name
...
# 2 "ex2.c" 2
int main()
{
printf("%d\n", 2 + 2 | ~ 2 + 2);
return 0;
}
这很奇怪,它可以工作,看起来像gcc
和clang
在解析命令行参数时的bug(或特性)。
看起来像gcc
用空格代替宏观声明中的第一个=
标志。所以参数:
-D b+=2
等于
#define b+ 2
因为gcc
有一个扩展来解释它,它等于
#define b + 2
这使得预处理器输出:
printf("%d\n", 2 + 2 | ~ 2 + 2);
表达式2 + 2 | ~ 2 + 2
等于(2 + 2) | ((~ 2) + 2)
(见operator precedence),它在twos complement系统上等于4 | (-3 + 2)
,等于4 | -1
。在二重补充-1
等于0xff....ff
所以4 | -1
等于0xff...ff
(因为它是二元OR),这是-1
。