2014-01-27 31 views
2

爲什麼max(0,1)在此程序中的行爲與max(1,0)不同?與括號一起使用時宏變化的行爲

#define max(a,b) ((a)>(b))?(a):(b) 
int main() 
{ 
    printf("max(0,1) = %d \n",max(0,1)); 
    printf("max(0,1)+1 = %d \n",max(0,1)+1); 
    printf("max(0,1)+2 = %d \n",max(0,1)+2); 
    printf("max(1,0) = %d \n",max(1,0)); 
    printf("max(1,0)+1 = %d \n",(max(1,0)+1)); 
    printf("max(1,0)+2 = %d \n",(max(1,0)+2)); 
    return 0; 
} 

輸出:

max(0,1) = 1 
max(0,1)+1 = 2 
max(0,1)+2 = 3 
max(0,1) = 1 
max(1,0)+1= 1 
max(1,0)+2= 1 

爲什麼做這些表現良好,如果使用一個額外的括號?

#define max(a,b) (((a)>(b))?(a):(b)) 
+0

想想擴張的結果:'MAX(0,1)+ 1' =>'(( 0)>(1))→(0):(1)+ 1'這相當於'(0> 1)? ((0)>(1))→(0):(1))+ 1「的情況下,與第一種情況下的」0:(1 + 1) 0:1)+ 1'。 – Dirk

+0

另請參閱http://stackoverflow.com/questions/5812877/why-one-needs-two-brackets-to-use-macros-in-c-c – doctorlove

回答

1

三元運算符? :具有非常低的運算符優先級:比加法低得多。因此,您需要將三元數字放在括號中,以便在用於計算最大值時,最後的加法(如果有的話)在之後的三元數中計算出

你總是可以訴諸unpicking宏:

max(1,0) + 1 unpicks,與max你的第一個定義(1) > (0) ? (1) : (0) + 1這是當然的,1。第二個定義是((1) > (0) ? (1) : (0)) + 12

2

因爲?:條件運算符的運算符優先級低於二進制運算符的+

因此max(1,0)+1被解釋爲,爲什麼你不應該使用函數宏1>0?1:(0+1)

很好的例子。

0

宏擴展#define max(a,b) ((a)>(b))?(a):(b)後,您的發言

printf("max(0,1)+1 = %d \n",max(0,1)+1); 
printf("max(1,0)+1 = %d \n",(max(1,0)+1)); 

看起來像

printf("max(0,1)+1 = %d \n",0 > 1 ? 0: (1+1)); 
printf("max(1,0)+1 = %d \n",(1 > 0 ? 1: (0+1))); 
相關問題