2010-10-14 16 views
14

Sono molto convinto della spiegazione che ho trovato che diceva che i = ++i is not undefined per quanto riguarda il C++ 0x, ma non sono in grado di giudicare se il comportamento di i += ++i è ben definito o meno. Qualche acquirente?I + = ++ Ho un comportamento non definito in C++ 0x?

+0

g ++ dice * sì, è UB. * – kennytm

+1

@KennyTM: Ho la versione 4.5.0 e mi avverte anche di i = ++ non essendo definito. Che versione stai usando? Sei riuscito a compilare i = ++ i senza l'avviso? –

+0

entrambi i = ++ i e i + = ++ i sono UB –

risposta

9

Il ragionamento che rende ben definito i = ++ii = ++i per dimostrare che i += ++i deve anche essere ben definito.

i += ++i equivale a i += (i += 1) e le nuove regole di sequenza richiedono che l'assegnazione avvenga prima del calcolo del valore della sottoespressione i += 1.
Ciò significa che il risultato dell'espressione i += ++i deve essere lo stesso di i = 2 * i + 1.

Modifica: Devo rivedere la mia risposta, perché il comportamento non è definito dopo tutto.
Il comportamento di i += ++i non è definito, poiché i calcoli dei valori delle sottoespressioni i (argomento lato sinistro) e ++i sono non correlati l'uno con l'altro e uno di essi contiene un aggiornamento dell'oggetto i.

Questo non è un problema per l'espressione i = ++i, perché il i sul lato sinistro non subisce una conversione lvalue a rvalue, il che accade nel caso i += ++i.


Su una nota secondaria: non scrivere tale codice in alcun progetto serio. Si basa troppo sulla conoscenza esatta delle regole del sequenziamento e ci saranno molte persone che non comprendono correttamente le regole del sequenziamento, non sono a conoscenza del cambiamento delle regole che è il risultato del DR 637 o sono inciampate mancando alcune importanti aspetti dell'espressione in questione (come è successo a me durante la composizione della prima revisione di questa risposta).

+0

i + = ++ I sarebbe equivalente a i = i + ++ i; tale che io venga valutato solo una volta. Ma è definito quale di i o ++ i viene valutato per primo? –

+0

@Saurabh: hai ragione. La differenza tra 'i = ++ i' e' i + = ++ i' è il calcolo del valore della mano sinistra 'i', che non ha seguito con' ++ i'. Ciò rende il risultato indefinito. Aggiornerò la mia risposta di conseguenza. –

+0

Grazie.Avevo lo stesso in mente, ma non ne ero completamente sicuro. –

Problemi correlati