Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Llaves dentro de funcion

Estas en el tema de Llaves dentro de funcion en el foro de C/C++ en Foros del Web. Tengo una duda, cuando tengo una funcion como esta: void main() { int x, y,z; x = 5; y = 4; z = x + ...
  #1 (permalink)  
Antiguo 28/05/2011, 19:46
 
Fecha de Ingreso: mayo-2011
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Pregunta Llaves dentro de funcion

Tengo una duda, cuando tengo una funcion como esta:

void main() {

int x, y,z;
x = 5;
y = 4;
z = x + y;

{
int y = 20;
}

cout << "x =" << x << " y =" << y << " z = " << z <<endl;

}

Yo se que el resultado al imprimir es que 'y' vale 4. Mi duda esta referida a la porcion de codigo que se ejecuta dentro de las llaves:

{
int y = 20;
}

Durante la ejecucion si se crea una nueva variable 'y' y si se le asigna el valor de 20, pero cuando termina 'y' sigue valiendo 4. Al abrir las llaves esto hace que esta porcion de codigo se ejcute pero que solo valga dentro de las llaves? y luego 'y' vuelve a tener el valor que le fue asignado fuera de las llaves? osea la 'y' declarada dentro de las llaves es otra 'y'? porque cuando hago el debug, la 'y' fuera de las llaves si cambia pero solo hasta terminar esa porcion de codigo, y luego vuelve a tener el valor de 4. Alguien me explica? Muchisimas gracias.
  #2 (permalink)  
Antiguo 28/05/2011, 20:25
 
Fecha de Ingreso: abril-2011
Mensajes: 224
Antigüedad: 13 años
Puntos: 8
Respuesta: Llaves dentro de funcion

Al declarar "y" adentro de las llaves lo que haces es crear una variable LOCAL... que sólo existirá en el bloque en el que fue declarada (En este caso entre las 2 llaves).

Te recomiendo imprimir el valor de "y" también adentro del bloque, para que veas que adentro del bloque si va a valer 20, pero afuera volverá a valer 4.

Saludos!
  #3 (permalink)  
Antiguo 28/05/2011, 20:48
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Llaves dentro de funcion

Si compilas con GCC y la opcion -S te devuleve el codigo assembler del programa.

Código C:
Ver original
  1. int main() {
  2.  
  3. int x, y,z;
  4. x = 5;
  5. y = 4;
  6. z = x + y;
  7.  
  8. {
  9. int y = 20;
  10. }
  11.  
  12. x = y;
  13. return 0;
  14. }
Código C:
Ver original
  1. .file   "h.c"
  2.     .def    ___main;    .scl    2;  .type   32; .endef
  3.     .text
  4. .globl _main
  5.     .def    _main;  .scl    2;  .type   32; .endef
  6. _main:
  7.     pushl   &#37;ebp
  8.     movl    %esp, %ebp
  9.     subl    $24, %esp
  10.     andl    $-16, %esp
  11.     movl    $0, %eax
  12.     addl    $15, %eax
  13.     addl    $15, %eax
  14.     shrl    $4, %eax
  15.     sall    $4, %eax
  16.     movl    %eax, -20(%ebp)
  17.     movl    -20(%ebp), %eax
  18.     call    __alloca
  19.     call    ___main
  20.     movl    $5, -4(%ebp)
  21.     movl    $4, -8(%ebp)
  22.     movl    -8(%ebp), %eax
  23.     addl    -4(%ebp), %eax
  24.     movl    %eax, -12(%ebp)
  25.     movl    $20, -16(%ebp)
  26.     movl    -8(%ebp), %eax
  27.     movl    %eax, -4(%ebp)
  28.     movl    $0, %eax
  29.     leave
  30.     ret

Por si no conoces algo de assembler, con movl asignas memoria, con add sumas.

Ahora analisemos un poco el codigo.

movl $5, -4(%ebp)


Esto esta asignando 5 a una parte de la memoria. En nuetro ejemplo teniamos x=5; por lo que deducimos que -4(%ebp) es la direccion de X (por asi decirlo).

movl $4, -8(%ebp)

Esto asigna 4 a -8(%ebp) por lo tanto es Y.



movl -8(%ebp), %eax
addl -4(%ebp), %eax
movl %eax, -12(%ebp)

Se carga Y en registro, se le suma X a ese registro y se guarda en -12(%ebp) que es Z.

movl $20, -16(%ebp)

Se asigna 20 a -16(%ebp). En nuetro codigo decia Y = 20; que estaba entre los corchetes, pero vemos que usa otra direccion, por lo tanto en el ambito este es como tener dos variables separadas. Nada mas que dentro de esas llaves tiene el mismo nombre que otra variable. Por lo que estamos haciendo inaccesible a la primer Y.

Espero haberte ayudado con tu duda. Yo acabo de aprender una nueva herramienta de C/c++.
  #4 (permalink)  
Antiguo 28/05/2011, 21:20
 
Fecha de Ingreso: mayo-2011
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Llaves dentro de funcion

Muchisimas gracias a ambos, la parte de assembler lo deja todo muchismo mas claro para mí, ahora entiendo porque al hacer el debug es que el 'y' que esta afuera de las llaves pareciera no tener un valor a la hora de instanciar la que esta adentro, pero esto solo ocurre porque en el ambito no pueden haber 2 'y' claro que esta nueva 'y' usa otra direccion de memoria y a la hora de terminar el bloque la 'y' anterior sigue siendo la misma.

Muchas gracias.

Etiquetas: funcion, llaves, sintaxis
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:54.