È I = + ++ i indefinito comportamento in C ++ 0x?
-
30-09-2019 - |
Domanda
Sono molto convinto con la spiegazione che ho trovato che ha detto che i = ++i
non è indefinito quanto C ++ 0x è interessato, ma io sono in grado di giudicare se il comportamento di i += ++i
è ben definito o no. Eventuali acquirenti?
Soluzione
Il ragionamento marchi i = ++i
ben definiti può essere ugualmente utilizzata per dimostrare che i += ++i
deve essere ben definito.
i += ++i
è equivalente i += (i += 1)
e le nuove norme sequenziamento richiedono che l'assegnazione avviene prima del valore-calcolo della sotto-espressione i += 1
.
Ciò significa che il risultato del i += ++i
espressione deve essere la stessa per i = 2 * i + 1
.
Modifica:. che devo rivedere la mia risposta, perché il comportamento è indefinito, dopo tutte le nazioni
Il comportamento di i += ++i
è indefinito, perché il valore-calcoli della sotto-espressioni i
(argomento lato sinistro) e ++i
sono non in sequenza in relazione tra di loro ed una di esse contiene un aggiornamento della i
dell'oggetto.
Questo non è un problema per il i = ++i
espressione, perché il i
sul lato sinistro non subisce una conversione lvalue a rvalue, il che accade nel caso i += ++i
.
Su un lato-nota: non scrivere tale codice in qualsiasi progetto serio. Essa si basa troppo sulla esattamente conoscere le regole di sequenziamento e ci saranno molte persone che o non capiscono correttamente le regole di sequenziamento, non sono a conoscenza del cambiamento delle regole che è il risultato di DR 637 o ottenere scattato dalla mancanza di alcuni importanti aspetti dell'espressione in questione (come è successo a me quando componi la prima revisione di questa risposta).