2010-11-05 17 views
5

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

+0

questa domanda aggiunge qualcosa alla discussione? – KevinDTimm

+0

Cosa si intende per comportamento non definito. –

+1

Solo per curiosità: cosa significa '(i, i ++, i)' significa? Questa è una lista? – sleske

risposta

11

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:

  • le due modifiche di i sono separati da un punto di sequenza (la seconda virgola).
  • la modifica di i in i++ è separata 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é è permesso di accedere i e modificarlo senza un punto sequenza interveniente, a condizione che l'accesso è " per determinare il valore da memorizzare "(5/4).
  • Come dice Als, 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 ;-)
+0

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

+0

Volevo rispondere ma non l'ho fatto. [Ancora un'altra domanda comportamentale non definita] ;-) –

+0

@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"? –

0

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.

0

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.

+0

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

Problemi correlati