2011-10-03 14 views
6

¿Podría alguien explicar exactamente el concepto de alcance y vida de la variable en C. ¿Es diferente en C++? Estoy confundido entre el alcance y la vida.Alcance vs vida de la variable en C

+0

Cómo aceptar o no la respuesta? – vikky

Respuesta

5

El ámbito es la región a la que se puede acceder a la variable.
El tiempo de vida es el tiempo durante el cual un objeto permanece válido.

Un ejemplo simple:

#include <iostream.h> 

void doSomething() 
{ 
    x = 5; //Error! Not Accessible 
} 

int main() 
{ 

     int x = 4; 
     std::cout<< x << endl; 
     { 
      int x = 2; 
      cout << x << endl; 
     } 
     doSomething(); 
     std::cout<< x << endl; 
     return 0; 
} 

Lo anterior da la salida:

En el programa anterior,
curso de la vida de la variable x = 4 es t a lo largo de la principal, es decir: permanece vivo durante la ejecución de la principal, también es accesible dentro de la principal, ese es su alcance. Tenga en cuenta que no se puede acceder a esta función porque está fuera del alcance de la variable x.

mientras que el alcance y la vida útil de la variable x = 2 está dentro de las llaves adjuntas {} dentro de la principal.

+0

¿"permanece válido" significa "en uso"? ¿Cómo hace una diferencia con el alcance de la variable? –

+0

@ R.MartinhoFernandes: bueno, no es incorrecto hablar sobre la duración de una variable, ya que una variable es un objeto. como recuerdo, el estándar define una variable como un objeto nombrado. sin embargo, probablemente no tenga sentido ahora, ¿y probablemente sea por una revisión de la historia de SO que elimine el contexto original de su observación? –

+1

Continuando con el comentario de Alf: una variable es una asociación de un símbolo (nombre) y un objeto. Lifetime concierne al objeto (y solo al objeto); El alcance concierne al símbolo (y solo al símbolo). –

20

"Alcance" de una variable es una región de código fuente, donde puede hacer referencia a esa variable.

"Duración" es cuánto tiempo existe durante la ejecución del programa.

Por defecto, el tiempo de vida de una variable local es el mismo que su ámbito de aplicación:

void foo() 
{ 
    int x = 123; 
    cout << x << endl; 
    x += 1; 
} 

int main(){ foo(); foo(); foo(); } 

Aquí, cada vez foo se llama se crea un nuevo x (espacio está reservado para él en la pila), y cuando la ejecución abandona el bloque donde se declaró x, se destruye x (que para int solo significa que el espacio que estaba reservado, ahora se libera para su reutilización).

Por el contrario:

void foo() 
{ 
    static int x = 123; 
    cout << x << endl; 
    x += 1; 
} 

int main(){ foo(); foo(); foo(); } 

Aquí, dado que x se declara static, el espacio está reservado para x antes de la ejecución del programa comience. x tiene una ubicación fija en la memoria, es una variable estática . Y C++ tiene reglas especiales sobre la inicialización de dicha variable: ocurre la primera vez que la ejecución pasa a través de la declaración.

Así, en la primera llamada de foo este x se inicializa, la declaración de salida muestra 123, y el incremento aumenta el valor en 1. En la siguiente llamada se omite la inicialización (que ya se ha realizado), el valor 124 se emite, y el valor se incrementa de nuevo. Pronto.

La vida útil de este x es desde el inicio de la ejecución hasta el final de la ejecución.

0

El alcance de una variable se determina en el momento de la compilación. Es la región en el programa donde se puede acceder al mismo objeto que se define a través de la definición a través de ese identificador.

La vida útil de un objeto es una característica que se define en el tiempo de ejecución, a través del flujo de ejecución. Se puede acceder a un objeto a través de un puntero incluso si la variable a través de la cual se definió no está dentro del alcance.

void f(char *a) { 
    *a = 'f'; 
} 

void g(void) { 
    char aChar = ' '; 
    f(&aChar); 
} 

Aquí el alcance de la variable aChar (el identificador) es el cuerpo de g. Durante la ejecución de g, la vida útil del objeto se amplía a la ejecución de f. Usando el identificador aChar dentro de f sería ilegal, el compilador le diría algo así como "indetificador desconocido aChar en la función f". Usar un puntero a ese objeto como se hizo arriba es completamente legal.

0

El alcance de una variable se refiere al grado en que diferentes partes de un programa tienen acceso a la variable. Las variables pueden ser declaradas como:

  • dentro de una función que se llama variables locales o variables internas.

  • Fuera de todas las funciones que se denominan variables globales o variables externas y la duración o "extensión" se extiende a lo largo de toda la ejecución del programa.

Aquí es tutorial detallado sobre las variables con ejemplos: What is variable in C

+0

¿Y qué hay del alcance frente a la vida según la pregunta? – J0e3gan

+0

alcance - definir qué partes de un programa pueden acceder a una vida útil variable - definir cuándo se crea y se destruye una variable –