-D name=definition and bitwise operator

-D name=definition and bitwise operator

我正在尝试了解下一个计算是如何执行的。

例如,如果这是我的终端命令

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;
}

这很奇怪,它的工作原理看起来像是 gccclang 在解析命令行参数时的错误(或功能)。

看起来 gcc 将第一个 = 登录宏声明替换为 space。所以参数:

-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) which on twos complement 系统等于 4 | (-3 + 2) 等于 4 | -1。在二进制补码上-1 等于 0xff....ff 所以 4 | -1 等于 0xff...ff(因为它是二进制或),即 -1.