Considere un mostrador de venta de entradas
Ha empleado a Mr.X y le ha pedido que mantenga un recuento del número de entradas reservadas. Mr.X usa una pizarra y una tiza para llevar la cuenta del número.
Desafortunadamente, Mr.X tiene pérdida de memoria a corto plazo. Cada vez que borra el número en la pizarra, olvida el número. Y comienza a contar desde el principio.
- ¿Qué significa "algo"?
- ¿Es necesario un montón de páginas de CV para conseguir un trabajo?
- He pensado en un algoritmo simple y cómo algunas empresas podrían usarlo. ¿Cómo puedo ganar dinero con eso?
- Quiero construir una casa de piedra óptima, usando una computadora para decidir la disposición de las piedras. ¿Cómo podría funcionar esto?
- ¿Cómo se vinculan los nodos al mismo nivel en un árbol binario?
Entonces, cada vez que alguien reserve un boleto, esta persona mantendrá el recuento como uno. ¡Incluso si se reservan 100 boletos, mantendrá el recuento final como 1! ¡El problema es su memoria a corto plazo!
Esto es lo que sucede con una variable normal .
Las variables locales pierden su dirección y valor cuando pierden su alcance. Si el compilador detecta que la dirección ya no es necesaria, la reutilizará para otra variable.
¡Codifiquemos este escenario!
cuenta vacía ()
{
int cnt = 0;
// Creo que no estás declarando esto afuera
// porque no quieres ninguna otra función
// para acceder a él.
cnt ++;
printf (“% d”, cnt);
}
int main ()
{cuenta ();
contar();
contar();
}
Y el resultado: 111
¡Uy!
Esto se debe a que cada vez que se llama conteo, una variable cnt se inicializa a 0, se incrementa, se imprime y luego se destruye .
Entonces, ¿qué hacemos ahora? : O
Aquí viene Mr.Y. Tiene memoria perfecta No olvida lo que había escrito en la pizarra. ¡Él agrega perfectamente 1 al número anterior y vuelve a escribir el número correctamente!
Mr.Y es nuestra variable estática
cuenta vacía ()
{
static int cnt = 0;
cnt ++;
printf (“% d”, cnt);
}
int main ()
{cuenta ();
contar();
contar();
}
El resultado: 123
¿Cómo sucedió eso?
¡Tenemos una declaración de inicialización que puede ejecutarse cada vez que se llama al conteo! ¿Por qué no se inicializó a 0? La magia estaba en el especificador “estático”.
Una vez que inicializa una variable como estática, permanece para siempre en el programa y no se inicializa de nuevo ni se destruye hasta el final del programa.
# 1: cnt creado, inicializado a 0, incrementado en 1, impreso
# 2: cnt incrementado en 1, impreso
# 3: cnt incrementado en 1, impreso
Y la belleza! No se puede acceder a la variable cnt desde el exterior.
Entonces, para una variable estática, la duración es un programa completo pero el alcance está dentro de su bloque.
Alcance variable de por vida
bloque local bloque
pgm global completo pgm completo
bloque pgm completo estático
Espero haberlo hecho lo suficientemente simple 🙂 Lo siento, ¡lo hice largo!