这里 SIMPLE_EX2 与 0x0040 进行或运算,并将其作为地址提供给 SIMPLE_EX1。我的理解正确吗?
#define SIMPLE_EX1 (0x0040 | SIMPLE_EX2)
这里 SIMPLE_EX2 与 0x0040 进行或运算,并将其作为地址提供给 SIMPLE_EX1。我的理解正确吗?
#define SIMPLE_EX1 (0x0040 | SIMPLE_EX2)
|
不是 C 中的管道符号。它是按位或。所以这个表达式:
0x0040 | SIMPLE_EX2
只需获取 的值SIMPLE_EX2
并将其第 7位(从右起)设置为 1。
不太可能,但请注意,如果SIMPLE_EX2
它本身是一个运算符的优先级低于|
的表达式,则整个表达式可能会被错误地解释。例如 if SIMPLE_EX2
is a?b:c
, thenSIMPLE_EX1
变成(0x0040|a)?b:c
了这不是我上面写的。
你应该阅读一本好的 C 编程书籍(如果你正在学习 C),或者如果你正在学习 C++,你应该阅读一本好的 C++ 编程书籍。
假设-dSIMPLE_EX2
为#define
常量整数,或括号中的常量整数表达式,则SIMPLE_EX1
该整数与0x0040
十六进制常量位或位运算(即十进制的 64,或二进制的 0b1000000)。
SIMPLE_EX2 正在与 0x0040 进行或运算
是的。
以及作为 SIMPLE_EX1 的地址的全部内容。
不。
#define 预处理器指令基本上是在编译之前完成的查找和替换文本操作。没有更多,注意到更少。因此,每当您编写代码时,它都会在编译前SIMPLE_EX1
被文本替换。(0x0040 | SIMPLE_EX2)
有趣的代码片段说明了这一点:
#define SIX 1+5
#define NINE 8+1
printf("Six times nine is %d.", SIX * NINE);
这段代码将返回 42,而不是预期的 54,因为预处理器将整个程序变成:
printf("Six times nine is %d.", 1 + 5 * 8 + 1);
它只是从右边设置第 7 位SIMPLE_EX2
并将其分配给SIMPLE_EX1