Почему 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,1) + 1 '=>' ((0)> (1))? (0): (1) + 1, что эквивалентно '(0> 1)? 0: (1 + 1) 'в первом случае и отличается от' (((0)> (1))? (0) :(1)) + 1', что в основном '((0> 1)? 0: 1) + 1'. – Dirk
См. Также http://stackoverflow.com/questions/5812877/why-one-needs-two-brackets-to-use-macros-in-c-c – doctorlove