2011-08-19 17 views
5

Mientras lee http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects, me encontré con este ejemplo:bloque C se convierte en la expresión: ({int a = 1; int b = 2; a + b;}) es igual a 3

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

que se puede utilizar exactamente como una función, es decir, max(1,2) es una expresión que evalúa a 2.

Mi PREGUNTA es ¿Cómo se evalúa el constructo ({ statment-list last-expression; }) con el valor de last-expression? Específicamente, ¿cómo se ve un árbol de análisis sintáctico de esta construcción? Pensé que { } siempre significaba una declaración compuesta, y las declaraciones no tenían valores. Traté de buscar en la gramática C y todavía no podía resolver este problema.

+0

'42;' es una afirmación también :-) – paxdiablo

+1

Ah, pero sospecho que el OP sabe que '42;' es una afirmación porque es una declaración en el Estándar C. La expresión de la declaración es no en el estándar C, sin embargo. –

Respuesta

10

Esta es una extensión de GCC llamada Statement Expressions. No es estándar C.

+0

Expresiones de declaración ?! Suena como un dolor de cabeza. – BoltClock

+0

¡Gracias! Por supuesto, debería haber leído "tanto el tipo de palabra clave, como la construcción de colocar una declaración compuesta entre paréntesis, son extensiones no estándar implementadas en el popular compilador C de GNU (GCC)". Oops. –

+0

Me gustan. Permiten hacer cosas inteligentes como esta. :) – balki

Cuestiones relacionadas