我试图了解如何执行下一个计算。
例如,如果这是我的终端命令
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
为什么我得到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
这很奇怪,它可以工作并且看起来像是clang
解析命令行参数的错误(或功能)。
看起来用空格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)
(参见运算符优先级)在二进制补码系统上等于4 | (-3 + 2)
等于4 | -1
。在二进制补码-1
上等于0xff....ff
所以4 | -1
等于0xff...ff
(因为它是二进制 OR),即-1
.
使用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;
}