2010-12-03 49 views
5

Je passe un test pratique C++ et je suis confus avec un ensemble de questions relatives à la portée d'accès et au point de déclaration. Les deux questions sont liées à chaque other..I connaître le answers..what i besoin est une bonne explication:Confusion des problèmes de portée globale C++

Quelle est la valeur de la variable locale x à la fin de la principale

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

ans: Non défini

Quelle est la valeur de y à la fin de main?

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

réponse: 5

Répondre

8

Il est contrôlé par lorsque la x intérieure vient à l'existence (le début de son champ d'application). La norme (3.3.1 dans la norme actuelle, 3.3.2 dans celui à venir) en partie (mes italiques):

Le point de la déclaration d'un nom est immédiatement après son déclarateur complet et avant son initialiseur.

Avec int x = x;, il est créé au moment de l'= de sorte que lorsque vous attribuez x à elle, c'est la intérieure x qui est utilisé. Comme cela n'a jamais été défini, c'est indéfini.

Avec int x[x];, la x intérieure vient en existence au ; afin qu'il utilise l'extérieur x comme la taille du tableau.

8

de la norme: 3.3.1 [basic.scope.pdecl]

Le point de déclaration un nom est immédiatement après son déclarateur complet (article 8) et avant son initialiseur (le cas échéant), sauf comme indiqué ci-dessous.

La norme a même deux exemples pour clarifier ce:

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

Voici la deuxième x est initialisé avec sa propre valeur (indéterminée). [Note: un nom non-local reste visible jusqu'au point de déclaration du nom local qui le cache. [Exemple:

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

déclare un tableau local de deux entiers. ]]

Ces deux exemples couvrent les deux cas de votre question.