2014-01-27 3 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

Подумайте о результате расширения: 'макс (0,1) + 1 '=>' ((0)> (1))? (0): (1) + 1, что эквивалентно '(0> 1)? 0: (1 + 1) 'в первом случае и отличается от' (((0)> (1))? (0) :(1)) + 1', что в основном '((0> 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)) + 1, которое равно 2.

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))); 
Смежные вопросы