Por que esse C é válido? - ({123;}) avalia para 123 [duplicado]
Possível duplicado:
em que versões de c é usado um bloco entre parênteses para retornar um valor válido?
A seguir está uma versão com segurança de tipo de uma macro MAX típica (isso funciona no gcc 4.4.5):
#define max(a,b) \
({ __typeof__ (a) _a = (a); \
__typeof__ (b) _b = (b); \
_a > _b ? _a : _b; })
Aqui, vemos que essa expressão, max (a, b) retorna o resultado da expressão
_a > _b ? _a : _b;
mesmo que essa expressão esteja em um bloco. Então, eu investiguei e descobri que isso é C válido:
int a = ({123;}); // a is 123
Alguém pode explicar por que essa gramática é válida e qual é o verdadeiro comportamento de ({declarações})? Além disso, você notará que {123;} não é uma expressão válida, mas apenas ({123;}) é.