C 为什么这种行为与宏有关?

C 为什么这种行为与宏有关?,c,macros,C,Macros,我有下面的代码。如果我给control_word as 6,为什么if条件计算为true并进入if块?这里到底发生了什么 #define MACRO1 0x01 #define MACRO2 0x02 #define MACRO4 0x04 #define MACRO3 MACRO1 | MACRO2 #define MACRO7 MACRO4 | MACRO3 int main() { if(control_word == MACRO3 || control_word == MACR

我有下面的代码。如果我给control_word as 6,为什么if条件计算为true并进入if块?这里到底发生了什么

#define MACRO1 0x01
#define MACRO2 0x02
#define MACRO4 0x04
#define MACRO3 MACRO1 | MACRO2
#define MACRO7 MACRO4 | MACRO3

int main()
{
    if(control_word == MACRO3 || control_word == MACRO7)
    {
        /*DO SOME OPERATION*/
    }
    else
    {
        /*DO SOMETHING ELSE */
    }

}

| and==运算符的优先级并不是您认为的那样。寓意:总是把你的宏括起来

#define MACRO3 (MACRO1 | MACRO2)
#define MACRO7 (MACRO4 | MACRO3)
因此,表达式扩展为

control_word == 0x01 | 0x02 || control_word == 0x01 | 0x02  | 0x04
control_word == 1 | 2 || control_word == 4 | 1 | 2
这反过来又形成了

(control_word == 1) | 2 || (control_word == 7) | 6)
就是

0 | 2 || 0 | 6
所以总的来说

2 || 6
它被C解释为“true或true”,并产生true。

表达式

control_word == MACRO3 || control_word == MACRO7
扩展到

control_word == MACRO1 | MACRO2 || control_word == MACRO4 | MACRO3
最终扩展到

control_word == 0x01 | 0x02 || control_word == 0x01 | 0x02  | 0x04
control_word == 1 | 2 || control_word == 4 | 1 | 2
查看,您可以看到运算符
==
|
具有更高的优先级,后者高于
|
,因此计算结果为:

((control_word == 1) | 2) || ((control_word == 4) | 1 | 2)
评估结果是

((6 == 1) | 2) || ((6 == 4) | 1 | 2)
它是(
6==1
false
,在算术表达式中被视为0-
6==4

那是

2 || 3
true
那是

2 || 3
true
由于2和3被视为
true
(非零),因此输入
if
块,而不是
else


要保留(假定的)意图(并获得您所表达的结果),您需要通过将宏的定义括在括号中来保护宏的扩展--请注意,这始终是一个好主意,以避免您所想的与实际发生的不一致。

这不是宏的问题。你可以执行所有的替换,你就会明白为什么会得到这个结果。是的,我同意括号解决了这个问题。你能解释一下它是如何输入if块的吗?这里的确切行为是什么?它不是|和| |之间的优先级问题,它是==和|。请参阅此代码,并考虑将代码更改为:<代码>如果((CopyOxWord=Grim3))(CopyOxWord=MaG7)时会发生什么情况