2010-12-03 10 views
5

Estoy tomando una prueba de práctica de C++ y estoy confundido con un conjunto de preguntas relacionadas con el alcance de acceso y la declaración. Tanto las preguntas están relacionadas con cada uno other..I conocer el answers..what que necesito es una explicación adecuada:Confundiendo problemas de alcance global de C++

¿Cuál es el valor de la variable local x al final del principal

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

ans: Indefinido

¿Cuál es el valor de y al final de la página principal?

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

respuesta: 5

Respuesta

8

Está controlado por cuando el interior x entra en existencia (el comienzo de su alcance). La norma 3.3.1 (en la norma actual, 3.3.2 en la próxima uno) en la parte (la cursiva es mía):

El punto de la declaración de un nombre es inmediatamente después de su completa declarador y antes de su inicializador.

Con int x = x;, que se crea en el punto de la = de manera que cuando se asigna x a ella, esa es la x interior que está siendo utilizado. Como eso no se ha establecido antes, no está definido.

Con int x[x];, el interior x entra en existencia en el ; por lo que está usando el exterior x como el tamaño de la matriz.

8

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

El punto de declaraciónpara un nombre es inmediatamente después de su declarador completa (cláusula 8) y antes de su inicializador (si hay alguno), excepto como se indica a continuación.

El estándar incluso tiene dos ejemplos para aclarar este:

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

Aquí el segundo x se inicializa con su propio valor (indeterminado).

[Nota: un nombre no local permanece visible hasta el momento de la declaración del nombre local que lo oculta. [Ejemplo:

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

declara un array local de dos enteros. ]]

Estos dos ejemplos cubren los dos casos en su pregunta.