Perché la seguente espressione data richiama un comportamento non definito?Perché questo comportamento non definito è?
int i = 5;
i = (i,i++,i) + 1
La mia domanda è influenzata da Als' question here
Perché la seguente espressione data richiama un comportamento non definito?Perché questo comportamento non definito è?
int i = 5;
i = (i,i++,i) + 1
La mia domanda è influenzata da Als' question here
Non è undefined.
risposto qui per C, Sequence points and partial order
penso che lo stesso vale in C++ (e qui è la mia risposta prima ho visto che link):
L'operatore virgola introduce un punto di sequenza (e costringe a un certo punto l'ordine in cui l'espressione deve essere valutata - lasciato prima destra), quindi:
i
sono separati da un punto di sequenza (la seconda virgola).i
in i++
è separata da tutto il resto da punti di sequenza.i
da =
è non separato dall'ultima occorrenza di i
nell'espressione, ma va bene perché è permesso di accedere i
e modificarlo senza un punto sequenza interveniente, a condizione che l'accesso è " per determinare il valore da memorizzare "(5/4).Considerando solo il fatto che ',' è un punto di sequenza, sì. Sfortunatamente lo standard è molto attento a questo: 'Nota che alcuni aspetti del sequenziamento nella macchina astratta non sono specificati; la restrizione precedente sugli effetti collaterali si applica a quella particolare sequenza di esecuzione in cui viene generato il codice reale. –
Volevo rispondere ma non l'ho fatto. [Ancora un'altra domanda comportamentale non definita] ;-) –
@Let_Me_Be: Confesso che non capisco quella nota a piè di pagina. Cosa significa che "codice effettivo" deve essere generato "in una sequenza di esecuzione"? –
Perché non è definito nello standard, che del post-incremento o la cessione avrà luogo prima; viene lasciato all'implementazione del compilatore per decidere il loro ordine.
E non è definito in C++ per assegnare un valore incrementato a se stessa:
i = i++
Quale dovrebbe essere i
dopo questo? Dovrebbe essere il valore precedente o uno più il valore precedente? L'ordine di esecuzione è lasciato al compilatore, quindi diverse piattaforme avranno risultati diversi.
Sono abbastanza sicuro che 'i' dovrebbe rimanere invariato dopo. È ancora un comportamento tecnicamente indefinito a causa della cosa del punto di sequenza, ma non c'è modo che possano esserci altri risultati. –
questa domanda aggiunge qualcosa alla discussione? – KevinDTimm
Cosa si intende per comportamento non definito. –
Solo per curiosità: cosa significa '(i, i ++, i)' significa? Questa è una lista? – sleske