2011-08-19 27 views
5

Durante la lettura http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects, mi sono imbattuto in questo esempio:blocco C diventa espressione: ({int a = 1; int b = 2; a + b;}) è uguale a 3

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

che è possibile utilizzare esattamente come una funzione, ad esempio max(1,2) è un'espressione valutante a 2.

La mia DOMANDA è, Come si valuta il costrutto ({ statment-list last-expression; }) al valore di last-expression? In particolare, come si presenta un albero di analisi di questo costrutto? Pensavo che lo { } significasse sempre un'istruzione composta, e le affermazioni non hanno valori. Ho provato a scavare nella grammatica C e ancora non riuscivo a capire questo problema.

+0

'42;' è anche una dichiarazione :-) – paxdiablo

+1

Ah, ma sospetto che l'OP sappia che '42;' è un'istruzione perché è un'istruzione in Standard C. L'espressione della dichiarazione è non in Standard C, comunque. –

risposta

10

Questa è un'estensione GCC denominata Statement Expressions. Non è standard C.

+0

Espressioni di dichiarazione ?! Sembra un mal di testa. – BoltClock

+0

Grazie! Ovviamente avrei dovuto leggere "sia la parola chiave typeof che il costrutto di inserire un'istruzione composta tra parentesi, sono estensioni non standard implementate nel popolare compilatore C di GNU (GCC)." Ops. –

+0

Mi piacciono. Permettono di fare cose intelligenti come questa. :) – balki

Problemi correlati