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;
}
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.
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á.
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.
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;
}
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