为什么这个行为与MACRO?

San*_*eep 2 c macros

我有以下code.if我给control_word为6为什么如果条件评估为真并进入内部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 */
    }

}
Run Code Online (Sandbox Code Playgroud)

小智 11

|的优先级 和==运算符不是你认为的那样.道德:总是把你的宏括起来!

#define MACRO3 (MACRO1 | MACRO2)
#define MACRO7 (MACRO4 | MACRO3)
Run Code Online (Sandbox Code Playgroud)

那么表达式会扩展到

control_word == 0x01 | 0x02 || control_word == 0x01 | 0x02  | 0x04
Run Code Online (Sandbox Code Playgroud)

反过来形成

(control_word == 1) | 2 || (control_word == 7) | 6)
Run Code Online (Sandbox Code Playgroud)

那是

0 | 2 || 0 | 6
Run Code Online (Sandbox Code Playgroud)

总而言之

2 || 6
Run Code Online (Sandbox Code Playgroud)

由C解释为"真或假",并且产生真实.

  • 它不是_ | _和_ || _之间的优先问题,它是_ == _和_ | _.请参阅[优先级图表](http://www.swansontec.com/sopc.html)并考虑将代码更改为:if((control_word == MACRO3)||(control_word == MACRO7))时会发生什么情况. (2认同)