【问题标题】:What do 0x0040 and pipe sign denote here?0x0040 和管道符号在这里表示什么?
【发布时间】:2012-09-05 09:11:32
【问题描述】:

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

#define SIMPLE_EX1  (0x0040 | SIMPLE_EX2) 

【问题讨论】:

  • 是的,您的理解是正确的。据我了解,“提供地址” 并不是您真正想说的,但最终听起来像您那样。
  • 除了“地址”这个词你是正确的。

标签: c++ c c-preprocessor


【解决方案1】:

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

0x0040 | SIMPLE_EX2

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


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

【讨论】:

    【解决方案2】:

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

    假设SIMPLE_EX2#define-d 作为常量整数,或者括号中的常量整数表达式,那么SIMPLE_EX1 是与0x0040 十六进制常量位或运算的整数(即十进制的64 , 或二进制的 0b1000000)。

    【讨论】:

    • 它不必是恒定的。无论整数表达式 SIMPLE_EX2 扩展为什么,结果都会将第 7 位设置为 1。
    • 同意,但原始发帖人没有为他的问题提供任何背景信息。如果SIMPLE_EX2 未定义或定义不明确(例如,作为字符串,或在某些使用SIMPLE_EX1 的情况下未定义的变量名称),则该问题没有意义。所以我不得不猜测SIMPLE_EX2 可能是什么。
    【解决方案3】:

    SIMPLE_EX2 正在与 0x0040 进行 ORed

    是的。

    以及作为 SIMPLE_EX1 的地址提供的全部内容。

    没有。

    #define 预处理器指令基本上是在编译之前完成的查找和替换文本操作。没有更多,注意到更少。因此,每当您在代码中写入SIMPLE_EX1 时,它都会在编译前以文本形式替换为(0x0040 | SIMPLE_EX2)

    有趣的代码 sn-p 说明了这一点:

    #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);
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多