-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;
}
这很奇怪,它的工作原理看起来像是 gcc
和 clang
在解析命令行参数时的错误(或功能)。
看起来 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
.
我正在尝试了解下一个计算是如何执行的。
例如,如果这是我的终端命令
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
在解析命令行参数时的错误(或功能)。
看起来 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
.