这里,SIMPLE_EX2与0x0040进行“或”运算,并将整个提供作为SIMPLE_EX1的地址。我的理解是否正确?
#define SIMPLE_EX1 (0x0040 | SIMPLE_EX2)
答案 0 :(得分:4)
|
不是C中的管道标志。这是有点明智的。所以这个表达式:
0x0040 | SIMPLE_EX2
只需获取SIMPLE_EX2
的值并将其设置为7 th 位(从右侧)到1。
不太可能,但请注意,如果SIMPLE_EX2
本身是一个运算符优先级低于|
的表达式,则整个表达式可能被错误地解释。例如,如果SIMPLE_EX2
为a?b:c
,则SIMPLE_EX1
变为(0x0040|a)?b:c
,这不是我上面写的。
答案 1 :(得分:2)
如果你正在学习C ++,你应该阅读一本优秀的C编程书(如果你正在学习C),或者阅读一本好的C ++编程书。
假设SIMPLE_EX2
为#define
- d为常量整数,或括号中的常量整数表达式,则SIMPLE_EX1
为0x0040
的整数位或整数十六进制常量(即十进制的64,或二进制的0b1000000)。
答案 2 :(得分: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);
答案 3 :(得分:1)
只是为SIMPLE_EX2
设置右侧的第7位,并将其分配给SIMPLE_EX1