2015-05-15 19 views
11
#include <iostream> 
using namespace std; 

int main() 
{ 
    int x=80; 
    int &y=x; 
    cout<<"x"<<x<<" "<<"y"<<y++; 
    return 0; 
} 

Il codice di cui sopra mi ha dato il seguente risultato:modifiche al riferimento a variabili in C++

81 80 

Qualcuno mi può spiegare come il valore della x modifiche 81? Il valore di è 80 e successivamente viene incrementato a 81, ma come è stato visualizzato in x?

Riflette perché è una variabile di riferimento? Quindi il valore avrebbe dovuto essere modificato in entrambi x e ?

+0

Sì, 'y' è solo un riferimento a' x', in modo da 'y ++' 'è in realtà la modifica x',' y' non ha alcun valore a sé stante. –

risposta

15

Hai un comportamento non definito perché le tue operazioni sono tra due consecutive sequence points (non ci sono punti di sequenza tra la valutazione degli argomenti della funzione). Puoi pensare vagamente ai punti di sequenza come marcatori "temporali" e tra due consecutivi non ti è permesso modificare la stessa variabile più di una volta.

Fondamentalmente il codice è equivalente a

std::cout << x << x++; // undefined behaviour 

dal y è solo un riferimento (un alias) per x.

1,9 esecuzione del programma [intro.execution] (sottolineare miniera)

14) Ogni valore computazione e effetto collaterale associato ad una full-espressione viene sequenza prima di ogni calcolo di valore e lato effetto associato alla successiva espressione completa da valutare.

15) Salvo quando diversamente indicato, valutazioni di operandi dei singoli operatori e di sottoespressioni delle singole espressioni sono non in sequenza. [Nota: in un'espressione valutata più di una volta durante l'esecuzione di un programma, le valutazioni sequenziate delle sue sottoespressioni non sequenziali e indeterminate di non devono essere eseguite in diverse valutazioni. - nota finale] I calcoli del valore degli operandi di un operatore sono sequenziati prima del calcolo del valore del risultato dell'operatore. Se un effetto collaterale su un oggetto scalare è inattivo rispetto a un altro effetto collaterale su lo stesso oggetto scalare o un valore calcolato utilizzando il valore dello stesso oggetto scalare e non sono potenzialmente simultanei (1.10), il comportamento non è definito. [Nota: la sezione successiva impone restrizioni simili, ma più complesse su calcoli potenzialmente concorrenti. -endnote]

Quando si chiama una funzione (se la funzione è in linea), ogni valore computazione e effetto collaterale associato con alcun argomento espressione, o con l'espressione suffisso designa la funzione chiamata , viene sequenziato prima esecuzione di ogni espressione o dell'istruzione nel corpo della funzione chiamata. [Nota: i calcoli del valore e gli effetti collaterali associati alle diverse espressioni dell'argomento sono stati annullati. - nota finale] Ogni valutazione nella funzione di chiamata (comprese altre chiamate di funzione) che non sia altrimenti specificata in sequenza prima o dopo l'esecuzione del corpo della funzione chiamata è sequenzialmente indeterminata rispetto a all'esecuzione della funzione chiamata .9 Diversi contesti in C++ causano la valutazione di una chiamata di funzione, anche se nessuna sintassi di chiamata della funzione corrispondente viene visualizzata nell'unità di traduzione. [Esempio: La valutazione di una nuova espressione richiama una o più allocazioni e le funzioni di costruzione ; vedere 5.3.4. Per un altro esempio, può verificarsi l'invocazione di una funzione di conversione (12.3.2) in contesti in cui non viene visualizzata la sintassi di chiamata della funzione .

correlati: https://stackoverflow.com/a/10782972/3093378

+0

Penso che tu abbia un extra non lì, sono tra gli stessi due punti di sequenza (cioè non c'è un punto di sequenza tra le due operazioni) – Borgleader

+0

@Borgleader grazie, corretto. – vsoftco

+0

Non credo che questo sia vero per i riferimenti. Dopo tutto, se il programmatore riceve due riferimenti come parametri, come può sapere se sono alias? Non sono sicuro se le regole per le operazioni sui riferimenti siano le stesse delle variabili regolari. – Puppy

Problemi correlati