2010-03-04 22 views

risposta

34

sì, è pari a:

int bar() 
{ 
    int temp = x; 
    ++x; 
    return temp; 
} 
+0

Buona spiegazione, grazie. – patros

+0

Se 'int' non è un' int', ma un 'MyClassWithOverloadedOperators', allora hai solo torto. –

+4

@Pavel: non sono d'accordo. Una classe con un operatore post-incremento sovraccarico che non implementa la semantica post-incremento corretta è errata. – Void

7

Sì, lo è ... restituirà il valore della x prima di incrementarlo e successivamente il valore di x sarà + 1 ... se è importante.

4

È definito.

Restituisce il valore di x prima dell'incremento. Se x è una variabile locale (non statica), questo incremento post non ha alcun effetto in quanto le variabili locali di una funzione cessano di esistere al termine della funzione. Ma se x è una variabile statica locale, una variabile globale o una variabile di istanza (come nel tuo caso), il suo valore sarà incrementato dopo il ritorno.

+0

Ma cosa succede in caso di un overload '++' -operator su una classe personalizzata? Sarà eseguito l'effetto? – Dario

+2

@Dario Sì, lo sarà. L'espressione che segue "return" verrà valutata completamente prima dell'esecuzione del ritorno. –

+1

@Dario. Sì, esattamente per la stessa ragione per cui se si restituisce x.dosomething(); ', l'effetto di' dosomething' verrà eseguito prima del ritorno. Sovraccarico post-incremento non è magico, è solo una funzione che restituisce un valore, che sembra essere il vecchio valore. –

4

Sì.

In postincrement (x ++) viene valutato il valore di x (restituito nel tuo caso) prima 1 viene aggiunto.

In preincrement (++ x) il valore di x viene valutato dopo 1 aggiunto.

Modifica: è possibile confrontare la definizione di incremento pre e post nei collegamenti.

1

Molti linguaggi di programmazione, come C++, sono ricorsivi nell'ordine in cui vengono eseguite le operazioni (non sto facendo alcuna implicazione su come il codice è effettivamente implementato dal compilatore qui). Le operazioni composte composte da operazioni ben definite sono a loro volta ben definite, poiché ogni operazione viene eseguita su base last-in, first-out.

Post-incremento restituisce il valore della variabile da incrementare prima dello incrementandolo, pertanto l'operazione return riceve tale valore. Nessuna definizione speciale di questo comportamento deve essere fatta.

+1

Non penso che la preoccupazione riguardasse quale valore sarebbe stato restituito, ma piuttosto se l'incremento si sarebbe verificato. È una preoccupazione comprensibile se il tuo modello mentale dice che il "ritorno" causa una fine immediata della funzione - c'è davvero tempo per l'incremento da applicare se la funzione è già terminata? Naturalmente sappiamo che la risposta è * sì *, ma solo perché il compilatore esegue una trasformazione come nella risposta di Poita per assicurarsi che la funzione non ritorni effettivamente finché non sono stati applicati tutti gli effetti collaterali. –

+0

Questo è ciò che intendo. L'istruzione 'return' si incontra dopo' x ++ '" restituisce ". Dato che 'x ++' è un'operazione, si dovrebbe pensare al ritorno come nel codice dimostrativo fornito da Poita_. In questo modo, è facile vedere che poiché 'x ++' viene eseguito e il suo valore di ritorno viene passato all'istruzione 'return'. Non ha senso che 'x ++' restituisca e * poi * incrementa. –

Problemi correlati