2015-12-24 6 views
11

Ho trovato macro sconosciute in un'implementazione del driver che non riesco a spiegare a me stesso. esempio semplificato è:perché funziona: ultima istruzione C++ come risultato dell'espressione

cout << ({int i=0; while(i<10) {++i;} i;}) << endl; 

Sarà uscita 10.

Ma perché questo non diventi un espressione rvalue a tutti? Sembra funzionare in C e in C++.

Qualcuno può spiegarmi? Puntare alle parole chiave e fare riferimento sarà fantastico.

+0

Mettere 'int i = 0; while (i <10) {++ i;} i; 'all'interno di un blocco circondato da'() 'fa printf per trattarlo come una funzione. A e legge l'ultimo io e lo stampa. – Michi

+1

Questo non può funzionare in C. C non supporta gli operatori '<<' sovraccarichi. – fuz

+0

@FUZxxl [Cosa ti fa dire che] (http://ideone.com/jLUk7j)? – Michi

risposta

15

Il GCC è un extension:

Un composto dichiarazione racchiuso tra parentesi può apparire come un espressione in GNU C.

L'ultima cosa nella dichiarazione composto dovrebbe essere espressione seguito da un punto e virgola; il valore di questa sottoespressione funge da valore dell'intero costrutto.

+0

@Borgleader: controllare il collegamento. "Questa funzione è particolarmente utile per rendere le definizioni delle macro" sicure "(in modo da valutare ogni operando esattamente una volta)" –

+1

@Borgleader: anche perché ci sono posti in C++ in cui sono consentite solo le espressioni, mentre spesso si vorrebbe scrivere codice "reale" - pensa l'inizializzazione dei membri. (Più in generale, la dicotomia frase/espressione è completamente artificiale e spesso si intromette, avere un modo per sfuggire è sempre una buona cosa) –

+0

"la dicotomia frase/espressione è completamente artificiale" - vero, è un linguaggio design scelta. Paragonato al ruby, dove * tutto * è un'espressione (grande potere espressivo), o python, che è molto severo (= sicuro, può catturare potenziali problemi come = vs ==), c/C++ è da qualche parte nel terreno di mezzo, ma sicuramente non in un punto debole. Lo strano operatore virgola è una buona prova che sta succedendo qualcosa di strano ... –

Problemi correlati