Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Caster en 6 Octubre 2012, 12:30 pm



Título: Duda sobre el ambito de las variables automaticas
Publicado por: Caster en 6 Octubre 2012, 12:30 pm
el ambito de una variable una variable automatica puede ser menor que una funcion? una instruccion por ejemplo:
Código
  1. for (auto int i = 5; i < count; ++i)
  2. {
  3. /* code */
  4. }

Es decir, que el valor 5 para la variable solo valga para este bucle, no se si me explico, es que en el libro que estoy leyendo dice que si pero no da ningun ejemplo sobre como se puede utilizar de esta manera.

Saludos


Título: Re: Duda sobre el ambito de las variables automaticas
Publicado por: overxfl0w13 en 6 Octubre 2012, 13:23 pm
el ambito de una variable una variable automatica puede ser menor que una funcion? una instruccion por ejemplo:
Código
  1. for (auto int i = 5; i < count; ++i)
  2. {
  3. /* code */
  4. }

Es decir, que el valor 5 para la variable solo valga para este bucle, no se si me explico, es que en el libro que estoy leyendo dice que si pero no da ningun ejemplo sobre como se puede utilizar de esta manera.

Saludos

http://c.conclase.net/curso/?cap=025

Ese modificador es aplicado por defecto si no se especifica ningún otro y si, es el correspondiente a todas las variables locales así que éstas desaparecen con la finalización del bloque.


Título: Re: Duda sobre el ambito de las variables automaticas
Publicado por: Caster en 6 Octubre 2012, 14:06 pm
Y se podria utilizar otro?, asi por ejemplo:

Código
  1. for (static int i = 0; i < count; ++i)
  2. {
  3. /* code */
  4. }


Título: Re: Duda sobre el ambito de las variables automaticas
Publicado por: overxfl0w13 en 6 Octubre 2012, 15:03 pm
Y se podria utilizar otro?, asi por ejemplo:

Código
  1. for (static int i = 0; i < count; ++i)
  2. {
  3. /* code */
  4. }

Claro, con static estarías "aumentando" el ámbito de la variable.


Título: Re: Duda sobre el ambito de las variables automaticas
Publicado por: Caster en 6 Octubre 2012, 15:13 pm
Muchas gracias por responder  :D

Saludos.


Título: Re: Duda sobre el ambito de las variables automaticas
Publicado por: rir3760 en 6 Octubre 2012, 18:00 pm
el ambito de una variable una variable automatica puede ser menor que una funcion? una instruccion por ejemplo:
Código
  1. for (auto int i = 5; i < count; ++i)
  2. {
  3. /* code */
  4. }

Es decir, que el valor 5 para la variable solo valga para este bucle
Correcto. El ámbito o alcance de una variable declarada dentro un bloque inicia justo después de su declaración y continua hasta el termino de este (del bloque).

Y se podria utilizar otro?, asi por ejemplo:

Código
  1. for (static int i = 0; i < count; ++i)
  2. {
  3. /* code */
  4. }
No.


Primero porque en C99 y C11 es posible declarar variables locales a los bucles "for" pero solo pueden incluir los calificadores "register" y "auto", utilizar (como en tu caso) "static" no es valido.


Segundo porque "static" no afecta el alcance de una variable sino su tipo de almacenamiento (en buen cristiano: la duración o "vida" de la variable):

* Las variables automáticas se crean justo en su declaración y desaparecen al terminar su ámbito (el bloque al que pertenecen).

* Las variables estáticas se crean, conceptualmente, justo antes de iniciar el programa y se inicializan con el valor indicado (si no existe su valor inicial es 0, 0.0 o NULL dependiendo del caso). Ellas desaparecen justo antes de terminar la aplicación.

Un programa de ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void f(void);
  5. void g(void);
  6.  
  7. int main(void)
  8. {
  9.   int i;
  10.  
  11.   for (i = 0; i < 5; i++)
  12.      f();
  13.  
  14.   puts("----");
  15.  
  16.   for (i = 0; i < 5; i++)
  17.      g();
  18.  
  19.   return EXIT_SUCCESS;
  20. }
  21.  
  22. void f(void)
  23. {
  24.   int i = 100;
  25.  
  26.   printf("%d\n", i);
  27.   i++;
  28. }
  29.  
  30. void g(void)
  31. {
  32.   static int i = 200;
  33.  
  34.   printf("%d\n", i);
  35.   i++;
  36. }

Y su salida es:
Código:
100
100
100
100
100
----
200
201
202
203
204

Un saludo