0x0040和管道符号在这里表示什么?

时间:2012-09-05 09:11:32

标签: c++ c c-preprocessor

这里,SIMPLE_EX2与0x0040进行“或”运算,并将整个提供作为SIMPLE_EX1的地址。我的理解是否正确?

#define SIMPLE_EX1  (0x0040 | SIMPLE_EX2) 

4 个答案:

答案 0 :(得分:4)

|不是C中的管道标志。这是有点明智的。所以这个表达式:

0x0040 | SIMPLE_EX2

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


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

答案 1 :(得分:2)

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

假设SIMPLE_EX2#define - d为常量整数,或括号中的常量整数表达式,则SIMPLE_EX10x0040的整数位或整数十六进制常量(即十进制的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