2017-08-10 41 views
3

我知道操作員如何工作,但我不明白下面代碼中的第二種情況如何給出1作爲結果。C中的決策 - :操作員示例

#define MIN(a,b) a<b ? a:b 
int x = MIN(1,2); //case 1, output is 1 
int x = MIN(1,1+1); // case 2 

不應該編譯器看到這個(情況2)爲「是1 < 1 + 1?」,我認爲應該是「是1 < 1?否它是不是」,表達式3被執行,且我們得到:「b」= 1 + 1 = 2。這是因爲上面的宏中a和b周圍沒有括號,或者因爲我遵循自己的規則並感到失落?請幫助....

另外,你如何解釋這種情況:

int x = MIN(1,2) + 1; //should we consider the "1" on the right? 
+8

使用括號中的語句(a,b)(((a)<(b))?(a):(b))' –

回答

8

你的第二個案例

MIN(1,1+1); 

由於1<1+1進行評估,以擴展到

1<1+1 ? 1:1+1; 

true上面的表達式在1中有效。


膨脹後

int x = MIN(1,2) + 1; 

導致

int x = 1<2 ? 1:2 + 1; 

操作+具有比三元運算:?更高的優先級,所以下面的表達式實際上相當於

聲明
1<2 ? 1:(2 + 1); 
3

不應該編譯器看到這個(情況2)爲 「是1 < 1 + 1?」,我認爲應該是「是1 < 1?不,它不是」

+<優先級數字(並且都具有比?:優先級數字)。

1 < 1 + 1 ? 1 : 1 + 1 

相同

(1 < (1 + 1)) ? 1 : (1 + 1)