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?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top