Perché questo è un comportamento indefinito?
-
29-09-2019 - |
Domanda
Perché la seguente data espressione invoke comportamento indefinito?
int i = 5;
i = (i,i++,i) + 1
La mia domanda è influenzata da Als' qui
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
ini++
è separato da tutto il resto da punti di sequenza. - la modifica
i
da=
è non separato dall'ultima occorrenza dii
nell'espressione, ma va bene perché stiamo permesso di accessoi
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.