2012-06-15 63 views
2

我有以下code.if我把control_word爲6爲什麼如果條件評估爲真,並進入內部,如果塊?究竟發生了什麼?爲什麼這個行爲與MACRO?

#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 */ 
    } 

} 
+3

這不是關於宏的問題。你可以執行所有的替換,你會看到爲什麼你會得到這個結果。 –

回答

2

表達

control_word == MACRO3 || control_word == MACRO7 

擴展到

control_word == MACRO1 | MACRO2 || control_word == MACRO4 | MACRO3 

,最終擴展到

control_word == 1 | 2 || control_word == 4 | 1 | 2 

precedence table,可以看到運營商==具有優先級數字比|,這高於||,所以評價是:

((control_word == 1) | 2) || ((control_word == 4) | 1 | 2) 

計算結果爲

((6 == 1) | 2) || ((6 == 4) | 1 | 2) 

,它是(6==1false,其在算術表達式視爲0 - 同爲6==4

((0 | 2) || (0 | 1 | 2) 

這是

2 || 3 

true 

如2和3被視爲true(非零),所以你進入if塊,而不是else

爲了保持(推定)意圖(和得到你所表達的結果)你需要通過將它們的定義放在圓括號中來保護宏的擴展 - 注意這是總是避免你的想法與實際發生的事情之間的不一致。

11

優先|和==運算符不是你認爲的那樣。道德:始終將你的宏括起來!

#define MACRO3 (MACRO1 | MACRO2) 
#define MACRO7 (MACRO4 | MACRO3) 

所以會發生什麼是表達擴展到

control_word == 0x01 | 0x02 || control_word == 0x01 | 0x02 | 0x04 

這反過來又形成

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

0 | 2 || 0 | 6 

所以所有的一切是

2 || 6 

它被C解釋爲「真或真」,並且產生真實。

+0

是的,我同意括號可以解決這個問題。請你解釋一下,如果它是如何進入的話,這裏的確切行爲是什麼? – Sandeep

+2

它不是** _和_ || _之間的優先問題,它是_ == _和_ | _。看看這個[優先級圖表](http://www.swansontec.com/sopc.html),並考慮將代碼更改爲:if((control_word == MACRO3)||(control_word == MACRO7) – pb2q

+0

已更正,請參閱更新。 – 2012-06-15 17:49:58