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?
risposta
Il ragionamento che rende ben definito i = ++i
i = ++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).
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? –
@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. –
Grazie.Avevo lo stesso in mente, ma non ne ero completamente sicuro. –
- 1. Fa while (i--) s + = a [i]; contiene un comportamento non definito in C e C++?
- 2. Does * & ++ causo un comportamento non definito in C++ 03?
- 3. Questo codice C ha un comportamento definito?
- 4. Ereditare costruttori in C++ 0x
- 5. C++: è la funzione che ripresenta un comportamento non definito?
- 6. Comportamento di un'espressione: definito o non definito?
- 7. comportamento diverso unordered_multimap in GNU ++ C++ 0x 11 e
- 8. Ordine di valutazione e comportamento non definito
- 9. Un comportamento non definito può cancellare il disco rigido?
- 10. C++ 0x regex in GCC
- 11. Il confronto tra puntatori è un comportamento non definito o non specificato in C++?
- 12. come cache un lambda in C++ 0x?
- 13. È un comportamento non definito nel codice specificato?
- 14. Si tratta di un bug di clang optimizer o di un comportamento non definito in C?
- 15. Esiste un oggetto funzione "non fare nulla" in C++ (0x)?
- 16. std :: map operator [] - comportamento non definito?
- 17. "& a + 1> & a" causa un comportamento non definito
- 18. Perché questo comportamento non definito è?
- 19. Perché std :: hash non è stato definito per std :: weak_ptr in C++ 0x?
- 20. Funzione "id" in C++ 0x
- 21. usare o non usare C++ 0x dispone
- 22. `` x--> 0 && array [x] `comportamento ben definito in C++?
- 23. Esempio non banale di comportamento non definito con const_cast
- 24. Omettendo un comportamento non definito di dichiarazione di ritorno in C89 (noto anche come ANSI C)?
- 25. C++ 11: le chiamate non formattate sono un comportamento non definito?
- 26. Come restituire un fstream (C++ 0x)
- 27. Questo comportamento non definito o un falso avviso positivo?
- 28. Inoltro di tutti i costruttori in C++ 0x
- 29. Come si combinano i valori hash in C++ 0x?
- 30. Implementazione di un buon C++ 0x error_condition?
g ++ dice * sì, è UB. * – kennytm
@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? –
entrambi i = ++ i e i + = ++ i sono UB –