Domanda

Perché la seguente data espressione invoke comportamento indefinito?

int i = 5;
i = (i,i++,i) + 1 

La mia domanda è influenzata da Als' qui

È stato utile?

Soluzione

Non è indefinito.

Risposta qui per C, Sequenza punti e ordine parziale

Credo che lo stesso vale in C ++ (e qui è la mia risposta prima ho visto quel link):

l'operatore virgola introduce un punto sequenza (e vincoli in una certa misura l'ordine in cui l'espressione deve essere valutata - lasciato prima destra), così:

  • le due modifiche di i sono separati da una sequenza punto (la seconda virgola).
  • la modifica di i in i++ è separato da tutto il resto da punti di sequenza.
  • la modifica i da = è non separato dall'ultima occorrenza di i nell'espressione, ma va bene perché stiamo permesso di accesso i e modificarlo senza un punto sequenza interveniente, purché che l'accesso è "per determinare il valore da memorizzare" (5/4).
  • Come Als dice, in pratica non sarebbe importa se quel codice ha definito il comportamento o no, a condizione che tutti avevano il senso comune di base non scriverlo; -)

Altri suggerimenti

Perché non è definito nello standard, che del post-incremento o la cessione avrà luogo prima; è lasciato alla realizzazione del compilatore per decidere il loro ordine.

Non è definito in C ++ per assegnare un valore incrementato a se stesso:

i = i++

Quello che dovrebbe essere i dopo questo? Dovrebbe essere il valore precedente o uno più il valore precedente? L'ordine di esecuzione viene lasciata al compilatore, così diverse piattaforme avranno risultati diversi.

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