Per esempio:i = i ++; è indefinito. Anche i = foo (i ++) è indefinito?
int foo(int i) { return i; }
int main()
{
int i = 0;
i = i++; // Undefined
i = foo(i++); // ?
return 0;
}
Quale sarebbe l'attuale standard ISO C++ specificare per questo caso?
EDIT:
Ecco dove mi confondo:
Salvo quando diversamente indicato, valutazioni di operandi dei singoli operatori e di sottoespressioni delle singole espressioni sono non in sequenza.
Se un effetto collaterale su un oggetto scalare è non in sequenza rispetto a uno altro effetto collaterale sullo stesso oggetto scalare o un valore di calcolo utilizzando il valore dello stesso oggetto scalare, e non sono potenzialmente concomitanti (1.10), il comportamento è indefinito.
In tutti i casi, l'assegnazione viene sequenza dopo il valore calcolo degli operandi destro e sinistro, e prima che il valore calcolo dell'espressione assegnazione
ogni valutazione in funzione chiamante (comprese altre chiamate di funzione) che non è altrimenti specificatamente sequenziato prima o dopo l'esecuzione del corpo della funzione chiamata è sequenzialmente indeterminato con rispetto all'esecuzione della funzione chiamata.
Così sembra si potrebbe avere un calcolo del valore sul lato sinistro della cessione (appena i
), e un effetto collaterale sul lato destro (la modifica di i
da i++
) che non sono in sequenza rispetto a vicenda.
EDIT2:
Per chi si trova qui, c'è davvero un grande spiegazione su sequenziamento che ho trovato here.
'foo (i ++)' va bene, 'foo (i, i ++)' non è definito –
foo (i ++) esegue una copia quindi non aumenta il suo valore se si tenta di stampare i dopo la chiamata di funzione. Ma foo (++ i) effettivamente lo fa. Guarda il gruppo –
'pippo (i ++)' va bene, 'foo ((i, i ++))' va bene. – haccks