2015-10-16 17 views
6

Qualcuno potrebbe elaborare il comportamento di riferimento in questo codice e perché è la stampa di 12 in prima linea al posto di 11.riferimenti in C++ con funzione

seguito è riportato il codice di

http://ideone.com/l9qaBp

#include <cstdio> 
using namespace std; 

int &fun() 
{ 
    static int x = 10; 
    x++; 
    return x; 
} 

int main() 
{ 
    int *ptr=&fun(); 
    int *ptr1=&fun(); 
    printf("%p %p \t %d %d",(void*)ptr,(void*)ptr1,*ptr,*ptr1); 
    return 0; 
} 

l'output del codice è

134519132 134519132 12 12

spiegare perché è sempre stampato in prima convocazione non ho capito quando seconda chiamata viene fatta deve stampare 12

risposta

2

Il tuo errore sembra essere nel pensare che printf() stampe *ptr non appena disponibile. Non è così; printf() non viene chiamato finché non vengono calcolati sia ptr sia ptr1. Poiché sia ​​ptr che ptr1 puntano alla stessa posizione di memoria, che è una variabile statica, e tale posizione viene aggiornata dopo la prima chiamata a fun()e il secondo, l'indirizzo contiene quel valore.

+0

Grazie per aver segnalato il mio errore nel pensare che printf() stampa * ptr non appena è disponibile. –

+0

Potresti per favore elaborare perché printf() viene chiamato dopo che entrambi i valori sono stati calcolati –

+0

@Raghib Ahsan Perché questo è il tipo di linguaggio C. In C descrivi cosa dovrebbe accadere in modo che l'ordine in quello che scrivi è l'ordine in cui il codice viene eseguito. Il tuo printf viene scritto dopo le istruzioni che eseguono le funzioni, quindi i valori vengono calcolati per primi e solo allora il tuo programma rilegge i risultati e lo stampa. Leggi la pagina wiki su C, e in particolare segui il link sulla programmazione imperativa nella prima frase, se vuoi saperne di più. [link] (https://en.wikipedia.org/wiki/C_ (programming_language)) – Nathilion

3

Il riferimento int restituito da divertimento() è lo stesso per entrambe le chiamate (ref a la x statica), quindi l'indirizzo di tale riferimento è lo stesso per entrambe le chiamate. Quindi il risultante dereferenziamento di quell'identico indirizzo è il valore identico corrente.

4

ptr e ptr1 puntano alla stessa variabile static int x. La seconda chiamata ha modificato il valore di static int x in 12, quindi si stampa il valore con derefernce ptr e ptr1, lo stesso risultato verrà stampato.

0

static le variabili hanno estensione di durata e sono memorizzate nella memoria allocata staticamente. Significa che la memorizzazione delle variabili locali static all'interno di una funzione non è allocata e deallocata su stack di chiamate.

volta x viene inizializzato al momento della compilazione, il valore di x viene mantenuta memorizzata tra le chiamate di funzione fun.

Come istruzioni C++ vengono eseguiti in sequenza, printf verrà eseguita dopo le invocazioni di due chiamate di funzione nelle linee indicate

int *ptr=&fun(); 
int *ptr1=&fun(); 

e quindi il valore di x sarà 12 prima dell'esecuzione printf istruzioni.

tenga presente che

int *ptr=&fun(); 
int *ptr1=&fun(); 

non è equivalente a

int& (*ptr)() = &fun; 
int& (*ptr1)() = &fun;  

In secondo frammento di ptr e ptr1 entrambi tiene l'indirizzo della funzione fun.In questo caso è necessario chiamare la funzione direttamente o utilizzando questi puntatori come

int a = ptr(); 
int b = ptr1(); 

dopo questo valore invocazione di a e b sarà 12.