bloco @C se torna expressão: ({int a = 1; int b = 2; a + b;}) é igual a 3

Enquanto lêhttp: //en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effect, Me deparei com este exemplo:

\#define max(a,b) \
   ({ typeof (a) _a = (a); \
       typeof (b) _b = (b); \
     _a > _b ? _a : _b; }) // WHY DOES THIS LINE WORK?

Que você pode usar exatamente como uma função, ou seja,max(1,2) é uma expressão avaliada como 2.

Minha pergunta é,Como({ statment-list last-expression; }) construir avaliar para o valor da última expressão? Especificamente, como é uma árvore de análise dessa construção? Eu pensei{ } sempre significou uma instrução composta, e as instruções não têm valores. Eu tentei cavar noC gramática e ainda não consegui resolver esse problem

questionAnswers(1)

yourAnswerToTheQuestion