Cómo explicar el uso e implementación de una variable estática en C a un principiante

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.

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!

Mira este ejemplo

Int main ()
{
Divertido();
Divertido():
Divertido ();
}
Divertido()
{
Estático int x = 1;
x ++;
Printf (“% d”, x);
}

La salida será
2
3
4 4

Si no hubiera x estática
Entonces la salida que obtenemos es
2
2
2

Entonces, cuando usamos static, se ejecuta solo una vez y la próxima vez que se descuida esta declaración

La variable estática es una variable cuyo alcance es hasta la llamada a la función pero no se restablece a su valor original después de que la función está inactiva. En otra llamada de función, tomará el mismo valor que tenía al final de la primera llamada de función.

More Interesting

¿Cuál es la solución eficiente para SPOJ CCROSSX?

Estoy tomando un curso en línea, Algorithms Part 1 de Sedgewick y Wayne en Coursera. Conozco bastante a Java, pero me llevó más de un día llegar a la mitad de la resolución de la primera tarea de programación. ¿Debería dejarlo? ¿Todos sienten lo mismo mientras aprenden sobre algoritmos?

Además de la velocidad, ¿qué otras medidas de eficiencia se podrían usar en un entorno real?

¿Cómo se fragmentan los archivos en el hadoop en 64 MB o 128 MB? ¿Cuál es el algoritmo utilizado para fragmentar los archivos?

¿Cuál es la diferencia entre la optimización de llamadas de cola y la optimización de recursión de cola?

¿Cuál es la mejor manera de practicar con algoritmos y estructuras de datos?

¿Por qué un montón de emparejamiento es más rápido que un montón binario?

¿Cómo se puede averiguar el número de veces que se repite una palabra en una cadena usando Java?

¿Cuál es la forma más eficiente de agregar 2 enteros?

¿Las personas en la industria realmente usan el algoritmo K-Nearest Neighbour en la práctica?

¿Hay algún algoritmo fijo para resolver el cubo de Rubik? Si es así, ¿qué es?

¿Debo aprender Algoritmos si soy ingeniero aeroespacial?

¿Por qué los estudiantes chinos tienen un talento extraordinario en programación y algoritmos?

Quiero aprender estructuras de datos OOP y algoritmos usando PHP. ¿Cuáles son los buenos recursos que usan PHP para enseñar algoritmos?

¿Se puede usar la GPU para optimizar los algoritmos gráficos?