2010-12-03 12 views
5

Ich nehme einen C++ - Praxistest und ich bin verwirrt mit einer Reihe von Zugriffsbereich und Punkt der Deklaration bezogenen Fragen. Beide Fragen sind zu jedem other..I Zusammenhang kennen die answers..what ich brauche, ist die richtige Erklärung:Confusing C++ globalen Umfang Probleme

Was ist der Wert der lokalen Variablen x ist am Ende der Haupt

int x = 5; 
int main(int argc, char** argv) 
{ 
    int x = x; 
    return 0; 
} 

ans: Undefiniert

Was ist der Wert von y am Ende von main?

const int x = 5; 
    int main(int argc, char** argv) 
    { 
     int x[x]; 
     int y = sizeof(x)/sizeof(int); 
     return 0; 
    } 

Antwort: 5

Antwort

8

Es wird gesteuert durch, wenn die inneren x kommt zustande (Beginn ihres Anwendungsbereichs). Die Standardzustände (3.3.1 im aktuellen Standard 3.3.2 in den kommenden eins) in Teil (Hervorhebung von mir):

Der Punkt der Erklärung für einen Namen ist sofort nach seinem kompletten declarator und vor sein Initialisierer.

Mit int x = x;, ist es an der Stelle der = erstellt, so dass, wenn Sie x zu zuweisen, das ist die inneren x, das verwendet wird. Da dies vorher noch nicht festgelegt wurde, ist es undefiniert.

Mit int x[x]; der innere x kommt zustande am ; so ist es die äußere x als Feldgrße verwenden.

8

von der Norm: 3.3.1 [basic.scope.pdecl]

Der Punkt der Erklärung für einen Namen unmittelbar nach seinem vollständigen declarator ist (Ziffer 8) und vor seinem initializer (falls vorhanden), außer wie unten angegeben.

Der Standard hat auch zwei Beispiele, dies zu klären:

int x = 12; 
{ int x = x; } 

Hier zweiten x mit seinem eigenen (unbestimmt) Wert initialisiert wird.

[Hinweis: ein nichtlokaler Name bleibt bis zur Deklaration des lokalen Namens sichtbar, der ihn verbirgt. [Beispiel:

const int i = 2; 
{ int i[i]; } 

erklärt ein lokales Array mit zwei ganzen Zahlen. ]]

Diese beiden Beispiele decken die beiden Fälle in Ihrer Frage ab.