2015-10-16 13 views
6

Könnte jemand bitte das Verhalten der Referenz in diesem Code erarbeiten und warum es 12 druckt in erster Linie statt 11.Referenzen in C++ mit Funktion

Unten ist der Code

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; 
} 

die Ausgabe des Codes ist

134519132 134519132 12 12

Bitte erklären, warum ist auf den ersten Anruf ich verstehe, wenn der zweite Anruf es drucken soll 12

Antwort

2

Ihr Fehler scheint zu denken, dass printf()*ptr druckt, sobald es verfügbar ist. Es tut nicht; printf() wird nicht aufgerufen, bis sowohl ptr als auch ptr1 berechnet sind. Da sowohl ptr als auch ptr1 auf die gleiche Speicherstelle zeigen, die eine statische Variable ist, und diese Position wird nach dem ersten Aufruf von fun()und der Sekunde aktualisiert, hält die Adresse diesen Wert.

+0

Danke für den Hinweis auf meinen Fehler in der Annahme, dass printf() druckt * ptr, sobald es verfügbar ist. –

+0

Könnten Sie bitte erläutern, warum printf() aufgerufen wird, nachdem beide Werte berechnet wurden –

+0

@Raghib Ahsan Weil das ist, was für eine Sprache C ist. In C beschreibst du, was passieren soll, also ist die Reihenfolge, in der du Dinge eingibst, die Reihenfolge, in der der Code ausgeführt wird. Ihr printf wird nach den Anweisungen geschrieben, die die Funktionen ausführen, daher werden die Werte zuerst berechnet und erst dann liest Ihr Programm die Ergebnisse zurück und druckt sie. Lesen Sie Wiki-Seite auf C, und folgen Sie besonders dem Link über imperative Programmierung im ersten Satz, wenn Sie mehr darüber erfahren möchten. [link] (https://en.wikipedia.org/wiki/C_ (programming_language)) – Nathilion

3

Der int Referenz zurückgegeben von fun() die gleiche ist für beide Anrufe wird nicht gedruckt zu werden (ref die statische x), daher ist die Adresse dieser Referenz für beide Aufrufe gleich. Daher ist die resultierende Dereferenz der identischen Adresse der aktuelle identische Wert.

4

ptr und ptr1 zeigen auf die gleiche Variable static int x. Der zweite Aufruf änderte den Wert von static int x zu 12, dann drucken Sie den Wert von derereforce ptr und ptr1 aus, das gleiche Ergebnis wird ausgedruckt.

0

static Variablen haben lebenslangen Umfang und sind im statisch zugewiesenen Speicher abgelegt. Dies bedeutet, dass der Speicher von static lokalen Variablen innerhalb einer Funktion nicht auf Call-Stack zugewiesen und freigegeben wird.

Sobald x zur Kompilierzeit initialisiert wird, wird der Wert x zwischen den Aufrufen der Funktion fun gespeichert.

Als C++ Anweisungen sequentiell ausgeführt werden, printf wird nach einem von zwei Funktions die Invokationen in den gegebenen Leitungen

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

und daher der Wert von x wird 12 vor der Ausführung printf Anweisungen Anrufe ausgeführt werden.

Beachten Sie, dass

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

zu

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

Im zweiten Schnipsel ptr und ptr1 beide Halte die Adresse der Funktion fun nicht äquivalent ist.In diesem Fall müssen Sie Funktion direkt aufrufen oder durch diese Zeiger als

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

nach diesem Aufruf Wert von a und b verwendet, wird 12 sein.