Usar una variable con el mismo nombre en espacios diferentes


Este código compila, pero tengo un error de tiempo de ejecución en Visual Studio :

Fallo de comprobación en tiempo de ejecución #3-la variable 'x' se está utilizando sin inicializar...

int x = 15;
int main()
{
    int x = x;
    return 0;
}

No entiendo ese comportamiento... en el cuadro de error cuando hago clic en continuar el programa se reanuda y x tiene un contenido dañado (como -8556328 en lugar de 15).

¿Por qué funciona este código sin problemas, y la matriz int está bien declarada?

const int x = 5;
int main()
{
     int x[x] = {1,2,3,4};
     return 0;
}
Author: Jarod42, 2015-10-01

4 answers

x se define a la izquierda de =.

Así que en x[x], [x] refiérase al global,

Considerando que en x = x;, x oculta el x global e inicializa de sí mismo -> UB.

 51
Author: Jarod42,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 20:35:24

Cuando se declara una nueva variable, su nombre se hace visible aquí

int x =
//     ^- there

Porque es en ese punto la variable está completamente declarada, y como tal; su nombre significa algo. En este momento, cualquier otra variable (previamente declarada) en un ámbito circundante se ocultará.

 35
Author: Bo Persson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 20:24:31

No hay un operador de resolución de alcance en C, por lo que es posible que no pueda usar

int x = x;

En su programa.

 5
Author: Adi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-01 20:24:23

Por favor use SRO( Operador de resolución de alcance ::) para decirle al compilador qué x es x real en su mente. Como los nombres definidos por el usuario son mutilados (Los nombres están decorados) algo como esto para evitar ambigüedades a su nivel, estos son solo nombres utilizados por el compilador que mejor se adapte a él

int x = 15;// Real name = gui_x
int main()
{
    int x = x;// lui_x
    return 0;
}

De esta manera, run-time sabrá qué versión está utilizando, pero para evitar ambigüedades, espera que use nombres específicos. A veces, el problema anterior surge cuando no sabe que ya está utilizando nombres usados. Para ello C++ ha creado SRO.
Ahora, en el caso de la matriz x es la dirección y no el entero que almacena algo, es por eso que el compilador no se mezcló. Necesitas escribir

namespace abc //now all global variables are belongs to this ns abc
int x = 15;// Real name = gui_x
int main()
{
int x = abc::x;// lui_x
return 0;
}
 1
Author: Vikas.Ghode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-06 11:53:13