Si compilas con GCC y la opcion -S te devuleve el codigo assembler del programa.
Código C:
Ver originalint main() {
int x, y,z;
x = 5;
y = 4;
z = x + y;
{
int y = 20;
}
x = y;
return 0;
}
Código C:
Ver original.file "h.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -20(%ebp)
movl -20(%ebp), %eax
call __alloca
call ___main
movl $5, -4(%ebp)
movl $4, -8(%ebp)
movl -8(%ebp), %eax
addl -4(%ebp), %eax
movl %eax, -12(%ebp)
movl $20, -16(%ebp)
movl -8(%ebp), %eax
movl %eax, -4(%ebp)
movl $0, %eax
leave
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++.