0

这里 SIMPLE_EX2 与 0x0040 进行或运算,并将其作为地址提供给 SIMPLE_EX1。我的理解正确吗?

#define SIMPLE_EX1  (0x0040 | SIMPLE_EX2) 
4

4 回答 4

4

|不是 C 中的管道符号。它是按位或。所以这个表达式:

0x0040 | SIMPLE_EX2

只需获取 的值SIMPLE_EX2并将其第 7位(从右起)设置为 1。


不太可能,但请注意,如果SIMPLE_EX2它本身是一个运算符的优先级低于|的表达式,则整个表达式可能会被错误地解释。例如 if SIMPLE_EX2is a?b:c, thenSIMPLE_EX1变成(0x0040|a)?b:c了这不是我上面写的。

于 2012-09-05T09:14:35.783 回答
2

你应该阅读一本好的 C 编程书籍(如果你正在学习 C),或者如果你正在学习 C++,你应该阅读一本好的 C++ 编程书籍。

假设-dSIMPLE_EX2#define常量整数,或括号中的常量整数表达式,则SIMPLE_EX1该整数与0x0040十六进制常量位或位运算(即十进制的 64,或二进制的 0b1000000)。

于 2012-09-05T09:14:46.417 回答
2

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);
于 2012-09-05T09:15:28.943 回答
1

它只是从右边设置第 7 位SIMPLE_EX2并将其分配给SIMPLE_EX1

于 2012-09-05T09:56:59.657 回答