2010-10-13 31 views
8

¿El siguiente código es válido en C++?¿Es este código válido C++?

const int var = 10; 
{ 
    int var[var]; // why doesn't this give any error ? 
} 

Nota: El código se compila en mi compilador g ++.

+0

¿Por qué sería * * No será válida? –

Respuesta

5

Sí, el código es válido C++. No local var es visible hasta el punto de declaración de var local.

Por lo tanto, int var[var] define una matriz local de 10 enteros.

19

¿Como está? No. ¿Si estuviera en el cuerpo de una función? Sí.

La primera línea declara una constante entera llamada var con un valor de 10.

Las llaves comienzan un nuevo bloque. Dentro de ese bloque, se declara una nueva variable, llamada var, que es una matriz de int con un tamaño igual al valor de la constante entera previamente declarada como var (10).

La clave es que var se refiere a la primera variable hasta después de la segunda variable llamada var está totalmente declarado. Entre el punto y coma que sigue a la segunda declaración y el corsé de cierre, var se refiere a la segunda variable. (Si había un inicializador para la segunda variable, var comenzaría a hacer referencia a la segunda variable inmediatamente antes de la inicialización.)

+0

Lol - +1 para el bit "en el cuerpo de una función": P –

+0

@Billy: Bueno, creo que es algo importante; si este código estuviera en el espacio de nombres o en el alcance de la clase, tendrías que hacer que el bloque sea un espacio de nombres o clase o función o algo ... –

+0

@James McNellis: nombre escondido, o una de mis características más odiadas. Puede pasar horas intentando entender qué sucede ... –

1

Si el código es C válida ++ Es un concepto de ALCANCE: Nombres Ocultación

const int var = 10; 
    { 
    int var[var]; // why doesn't this give any error ? 
    } 

Creo que este enlace borra la duda

en C++:

http://msdn.microsoft.com/en-US/library/9a9h7328%28v=VS.80%29.aspx

En C:

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fzexscope_c.htm

Si quieres profundo conocimiento sobre esto: Ir a este enlace, aquí la información que se trata de léxico frente ámbito dinámico

http://en.wikipedia.org/wiki/Scope_%28programming%29

pero en su código: "Alcance ::" de visibilidad de var. Aquí difiere como variable local y no local. llaves internas {x = 1; } variable local. donde como aquí {y = 1; {x = 1;}}, aquí es diferente.

enlaces útiles

http://msdn.microsoft.com/en-us/library/b7kfh662%28VS.80%29.aspx

http://www.awitness.org/delphi_pascal_tutorial/c++_delphi/c++_scope_variables.html

+0

@BE: Creo que los primeros 3 enlaces que dio son claros.cerca de este ejemplo> El ramining no es necesario –