En programación informática , una variable automática es una variable local que se asigna y desasigna automáticamente cuando el flujo del programa entra y sale del ámbito de la variable. El ámbito es el contexto léxico, en particular la función o el bloque en el que se define una variable. Los datos locales normalmente son invisibles (en la mayoría de los lenguajes) fuera de la función o el contexto léxico donde se definen. Los datos locales también son invisibles e inaccesibles para una función llamada , [nota 1] pero no se desasignan, volviendo al ámbito cuando el hilo de ejecución regresa al llamador.
Las variables locales automáticas se aplican principalmente a lenguajes recursivos de ámbito léxico . [nota 2] Las variables locales automáticas normalmente se asignan en el marco de pila del procedimiento en el que se declaran. [nota 3] Esto se hizo originalmente para lograr la reentrada y permitir la recursión , [nota 4] una consideración que todavía se aplica hoy. El concepto de variables automáticas en funciones recursivas (y anidadas ) en un lenguaje de ámbito léxico se presentó al público en general con ALGOL a fines de la década de 1950 y se popularizó aún más gracias a sus muchos descendientes.
El término variable local suele ser sinónimo de variable automática, ya que son lo mismo en muchos lenguajes de programación, pero local es más general: la mayoría de las variables locales son variables locales automáticas, pero también existen variables locales estáticas , especialmente en C. Para una variable local estática, la asignación es estática (la duración es la ejecución completa del programa), no automática, pero solo está dentro del alcance durante la ejecución de la función.
(Llamadas variables automáticas .)
Todas las variables declaradas dentro de un bloque de código son automáticas de forma predeterminada. Una variable automática no inicializada tiene un valor indefinido hasta que se le asigna un valor válido de su tipo. [1] El especificador de clase de almacenamiento auto
también se puede agregar a estas declaraciones de variables, pero como todas son automáticas de forma predeterminada, esto es completamente redundante y rara vez se hace.
En C, el uso de la clase de almacenamiento register
es una indicación para que el compilador almacene en caché la variable en un registro del procesador. Además de no permitir que se utilice el operador de dirección ( &
) en la variable o en cualquiera de sus subcomponentes, el compilador tiene la libertad de ignorar la indicación. [2]
En C++ , el constructor de variables automáticas se llama cuando la ejecución llega al lugar de la declaración. El destructor se llama cuando llega al final del bloque de programa dado (los bloques de programa están rodeados por llaves). Esta característica se utiliza a menudo para gestionar la asignación y desasignación de recursos, como abrir y luego cerrar automáticamente archivos o liberar memoria, lo que se denomina adquisición de recursos es inicialización (RAII).
Desde C++11, C++ permite declarar variables con el auto
especificador de tipo, [3] pero esto significa que el tipo de la variable se infiere y no se refiere al alcance de la variable.
(Llamadas variables locales ).
Similar a C y C++, pero no hay una palabra clave auto
or register
. Sin embargo, el compilador de Java no permitirá el uso de una variable local no inicializada explícitamente y dará un error de compilación (a diferencia de C y C++ donde el compilador generalmente solo dará una advertencia). El estándar de Java exige que cada variable local se inicialice explícitamente antes de ser utilizada. [4] Esto difiere de las variables de instancia, que se inicializan implícitamente con valores predeterminados (que son0para números ynulopara objetos).
(Llamadas variables léxicas , mías o privadas ).
En Perl, las variables locales se declaran utilizando el my
operador . Los escalares no inicializados tendrán el valor undef
; las matrices o hashes no inicializados tendrán el valor ()
. [5]
Perl también tiene un local
operador que no crea variables automáticas, [6] en lugar de eso, les otorga a las variables globales (de paquete) un valor temporal, cuyo alcance dinámico se limita al bloque que las contiene. Cuando se abandona el alcance de la variable, se restaura el valor anterior.