Você está na página 1de 9

Lenguajes de Programacion I

Asignaciones

Ayud. Nezzanotte, Nartin







Lenguajes de Programacin !
Cursada 2006
!ngenieria de Sistemas



acultad de Ciencias Exactas
Universidad Nacional del Centro
de la Provincia de Buenos Aires
Lenguafes de Programacion I
Apunte. Asignaciones
-1-

Lenguajes de Programacion I
Asignaciones


Objetivos
O jempliIicar situaciones de asignacion en esquemas de asignacion por copia de
valores.
O jempliIicar situaciones de asignacion en esquemas de asignacion por copia de
reIerencias.
O nalizar situaciones analogas entre asignaciones y pasajes de parametros.
O poner relaciones conceptuales importantes entre las asignaciones y otros
temas relevantes de la materia, como por ejemplo: dministracion de memoria,
diIerencias y similitudes entre lenguajes dinamicos orientados a objetos y
lenguajes tipo lgol, entre otros.

%emario
Variables
O istincion entre Valor, ReIerencia y Nombre.
signaciones entre variables
O oncepto: Que sucede en la sentencia 'a:b
O jempliIicacion en lenguaje : Orientado a asignacion por copia.
O jempliIicacion en lenguaje Java: Orientado a asignacion por reIerencia.
O omparacion entre ambos esquemas de asignacion:
4 istencia de ambos datos en asignaciones por copia.
4 reacion de alias y generacion de garbage en asignaciones por
reIerencia.
4 $imilitud con los esquemas de pasajes de parmetros
O signacion por reIerencia eplicita (Lenguaje e implicita (Lenguajes
dinamicos orientados a objetos.
tras signaciones
O signaciones con epresiones.
O signaciones con Iunciones.
O signaciones con constantes.

Lenguafes de Programacion I
Apunte. Asignaciones
-2-

Variables

oncepto de Variable:
'alor, Referencia y Nombre


n primer lugar, recordaremos algunos conceptos importantes con respecto al
manejo de variables.
e cada variable es posible distinguir:
Su valor. s decir, el dato que se almacena en la variable.
Su referencia. O sea, la direccion de memoria donde esta almacenado el valor de
la variable.
Su nombre. s decir, un identiIicador que permite reIerenciar en lenguaje natural
una direccion de almacenamiento.
e esta Iorma, podemos entender las variables como ternas de la siguiente Iorma:



Fig. 1: Representacin de una variable.


Por ejemplo:

'OR
ireccin Nombre
void main(){

int a=14;

[.]

}


26h a
Lenguafes de Programacion I
Apunte. Asignaciones
-3-
signaciones entre variables

oncepto de signacion:
"u sucede en la sentencia "a:b?

s importante entender correctamente que tratamiento lleva a cabo el lenguaje de
una sentencia de asignacion:
n una asignacion entre dos variables, el lenguaje realiza diIerentes acciones al
manipular las variables del lado izquierdo y derecho de la sentencia. on respecto al
lado izquierdo, se utiliza el nombre de la variable para acceder a la celda de la memoria
que este reIerencia, con el objetivo de almacenar el dato obtenido desde el lado derecho.
Para esto, la variable del lado derecho debe suIrir una etraccion de valor
(esreIerencing.
Veamos un ejemplo de un programa simple, codiIicado en lenguaje :

jemplo 1


Puede observarse la eistencia de los datos, ya que la sentencia de incremento en
b no tuvo ningun eIecto sobre el valor de a.
void main(){
int a=14;
int b=10;

a=b;
b++;

printf("\nEl valor de a es %d",a);
printf("\nEl valor de b es %d",b);
}


26h a

22h b


26h a

22h b


26h a

22h b

va47 de a es 10
va47 de b es 11

Lenguafes de Programacion I
Apunte. Asignaciones
-4-
Veamos ahora dos ejemplos similares codiIicados en lenguaje Java:

jemplo 2

Puede observarse la eistencia de los datos, ya que la sentencia de incremento en
b no tuvo ningun eIecto sobre el valor de a.
public class Main {
public Main() { }

public static void main(String[] args) {

int a=14;
int b=10;

a=b;
b++;

JOptionPane.showMessageDialog(null,
"El valor de a es "+a+
"\nEl valor de b es "+b,"Asignaciones,
JOptionPane.PLAIN_MESSAGE);

System.exit(0);
}

h a

h b

h a

h b

h a

h b

Lenguafes de Programacion I
Apunte. Asignaciones
-5-

jemplo 3




n el segundo caso, cuando se utilizo objetos de tipo 'ntero, puede observarse
que el comportamiento de la sentencia de asignacion es diIerente: en este caso no hubo
copia del valor de la variable sino de su reIerencia, ya que de lo contrario la sentencia de
incremento de b no hubiese aIectado el valor de a.
public class Main {
public Main() { }

public static void main(String[] args) {
Entero a=new Entero(14);
Entero b=new Entero(10);

a=b;
b.inc();

JOptionPane.showMessageDialog(null,
"El valor de a es "+a.valor()+
"\nEl valor de b es
"+b.valor(),"Asignaciones,
JOptionPane.PLAIN_MESSAGE);

System.exit(0);
}

:mero=
h a 1
h b
:mero=
1
:mero=
h a 0
h b
:mero=
2
a
h b
:mero=
2
:mero=
h 0 GRBGE
COEC%OR
public class Entero {

private int numero;

public Entero(int n) {
numero=n;
}

public int valor(){
return numero;
}




public void inc(){
numero++;
}

public void dec(){
numero--;
}
}//Fin clase Entero
Lenguafes de Programacion I
Apunte. Asignaciones
-6-
squemas de signacion:
Asignaciones por copia y Asignaciones por referencia

e los ejemplos precedentes puede concluirse que las sentencias de asignacion
tienen una semantica diIerente entre los primeros dos ejemplos y el tercero. sto se debe
a que el mecanismo de asignacion en cada caso es distinto. Punto que proIundizaremos
a continuacion.

Asignaciones por copia

l esquema de asignaciones entre variables por copia de valores Iunciona de la
siguiente manera:
$obre la variable del lado derecho de la sentencia se reali:a una extraccion del
valor almacenado en la celda de memoria. Luego, este valor es copiado en la celda de
memoria correspondiente a la variable del lado i:quierdo de la sentencia.
omo consecuencia, la unica relacion entre ambos datos es que en este punto del
programa- contienen el mismo valor en sus respectivas celdas de memoria. mbos
datos continuan siendo entidades completamente independientes, por lo cual cualquier
cambio en uno de ellos NO produce ningun eIecto sobre el otro.
ste esquema de asignacion puede ser observado en los primeros dos ejemplos.

Asignaciones por referencia

l esquema de asignaciones entre variables por reIerencia Iunciona de la siguiente
manera:
$obre la variable del lado derecho de la sentencia se reali:a una extraccion de la
direccion de memoria (referencia) donde se halla almacenado su valor. Luego, este
valor de direccion es copiado en la referencia correspondiente a la variable del lado
i:quierdo de la sentencia.
omo consecuencia, ambos nombres de variables reIerencian a la misma
direccion de memoria y, por ende, al mismo dato. on lo cual, cualquier cambio a ser
realizado a este dato puede eIectuarse por medio de cualquiera de los dos nombres. sta
situacion es conocida como 'generacion de alias.
iste otra consecuencia importante que debemos analizar:
Que sucede con el dato que reIerenciaba originalmente la variable del lado
izquierdo de la asignacion La respuesta es simple:
Si no eiste ninguna otra variable que lo reIerencie, se convierte en un bloque de
memoria utilizado pero inaccesible, es decir 'garbage. Por lo tanto, la generacion de
garbage es un riesgo que se corre cuando se utiliza este esquema de asignaciones entre
variables.
ste esquema de asignacion puede ser observado en el ejemplo numero 3.
Lenguafes de Programacion I
Apunte. Asignaciones
-7-

Analoga con esquemas de pasaje de parmetros

Resulta claro apreciar que eiste una Iuerte similitud entre estos esquemas de
asignaciones entre variables y dos tipos de pasajes de parametros. saber: Pasaje de
Parametros por opia-Valor y Pasaje de Parametros por ReIerencia, respectivamente.


Fig. 2: Relacin anloga entre pasaje de parmetros y asignaciones entre variables.

onclusiones

s posible concluir que ambos esquemas poseen beneIicios y perjuicios. n el
caso del lenguaje que, como vimos, utiliza un esquema de asignaciones por copia
tambien es posible asignar reIerencias si asi se desea. sto debe hacerse de manera
eplicita, utilizando punteros del lado izquierdo de la sentencia y por medio del
operador de etraccion de reIerencias (& en el lado derecho (Ver Iig. 3. , por
ejemplo, incorpora un mecanismo de generacion de alias a traves de la deIinicion del
tipo de dato 'reIerencia (Ver Iig. 4.
Generalmente, los lenguajes dinamicos orientados a objetos tienden a utilizar el
esquema de asignaciones entre variables por reIerencia. sto se debe a que un objeto es
un dato bastante mas complejo que una variable entera, pues no solo posee datos sino
tambien metodos. on lo cual, utilizar este esquema resulta mas Ileible.

[.]
int a=10;
int *pun;
pun= &a; //Asignacin de la direccin de `a en `pun.
[.]
Fig. 3: Asignacin de referencias explcita en C.

[.]
int a=10;
int &ref_a=a; //Declaracin e inicializacin de la referencia `ref_a a `a.
[.]
Fig. 4: eclaracin de un alias en C++.
signaciones
entre variabIes
Pasaje de
parmetros

signaciones por copia
signaciones por
referencia
Pasaje de parmetros
por copia
Pasaje de parmetros
por referencia
Lenguafes de Programacion I
Apunte. Asignaciones
-8-
tras asignaciones

Asignacin de una expresin o una constante

n este caso, no eiste distincion alguna entre asignacion por copia o reIerencia
ya que las epresiones no tienen reIerencias. La asignacion consiste en calcular el valor
de la epresion situada del lado derecho de la sentencia y almacenarlo en la celda de
memoria reIerenciada por la variable del lado izquierdo.
Por ejemplo:

[.]
int a;
a = 3 * 4;
[.]
Fig. 5: Asignacin de expresiones en C.

l caso de asignacion de una constante es analogo.


Asignacin de una funcin

n este caso, si se asignara a la variable del lado izquierdo el puntero a la Iuncion
ubicada en el lado derecho, la variable se comportaria como un puntero a la Iuncion.
sto no es un uso comun. Lo que se hace es ejecutar la Iuncion y, luego, se asigna el
valor resultado a la celda de memoria reIerenciada por la variable del lado izquierdo de
la sentencia (signacion por copia.
Por ejemplo:

[.]
int a;
a = maxim43,6);
[.]
Fig. 5: Asignacin del valor de una funcin en C.

n , por ejemplo, es posible copiar el puntero de una Iuncion pero debe hacerse
en Iorma eplicita hacia una variable de tipo puntero a Iuncion.

Você também pode gostar