SlideShare una empresa de Scribd logo
1 de 9
Descargar para leer sin conexión
Lenguajes de Programación I
Asignaciones
Ayud. Mezzanotte, Martín
Lenguajes de Programación I
- Cursada 2006 -
Ingeniería de Sistemas
Facultad de Ciencias Exactas
Universidad Nacional del Centro
de la Provincia de Buenos Aires
Lenguajes de Programación I
Apunte: Asignaciones
-1-
Lenguajes de Programación I
Asignaciones
Objetivos
• Ejemplificar situaciones de asignación en esquemas de asignación por copia de
valores.
• Ejemplificar situaciones de asignación en esquemas de asignación por copia de
referencias.
• Analizar situaciones análogas entre asignaciones y pasajes de parámetros.
• Exponer relaciones conceptuales importantes entre las asignaciones y otros
temas relevantes de la materia, como por ejemplo: Administración de memoria,
diferencias y similitudes entre lenguajes dinámicos orientados a objetos y
lenguajes tipo Algol, entre otros.
Temario
Variables
• Distinción entre Valor, Referencia y Nombre.
Asignaciones entre variables
• Concepto: ¿Qué sucede en la sentencia “a:=b”?
• Ejemplificación en lenguaje C: Orientado a asignación por copia.
• Ejemplificación en lenguaje Java: Orientado a asignación por referencia.
• Comparación entre ambos esquemas de asignación:
o Existencia de ambos datos en asignaciones por copia.
o Creación de alias y generación de garbage en asignaciones por
referencia.
o Similitud con los esquemas de pasajes de parámetros
• Asignación por referencia explícita (Lenguaje C) e implícita (Lenguajes
dinámicos orientados a objetos).
Otras Asignaciones
• Asignaciones con expresiones.
• Asignaciones con funciones.
• Asignaciones con constantes.
Lenguajes de Programación I
Apunte: Asignaciones
-2-
Variables
Concepto de Variable:
Valor, Referencia y Nombre
En primer lugar, recordaremos algunos conceptos importantes con respecto al
manejo de variables.
De cada variable es posible distinguir:
Su valor. Es decir, el dato que se almacena en la variable.
Su referencia. O sea, la dirección de memoria donde está almacenado el valor de
la variable.
Su nombre. Es decir, un identificador que permite referenciar en lenguaje natural
una dirección de almacenamiento.
De esta forma, podemos entender las variables como ternas de la siguiente forma:
Fig. 1: Representación de una variable.
Por ejemplo:
VALOR
Dirección Nombre
void main(){
int a=14;
[…]
}
EE ED
14
26ha
Lenguajes de Programación I
Apunte: Asignaciones
-3-
Asignaciones entre variables
Concepto de Asignación:
¿Qué sucede en la sentencia "a:=b”?
Es importante entender correctamente qué tratamiento lleva a cabo el lenguaje de
una sentencia de asignación:
En una asignación entre dos variables, el lenguaje realiza diferentes acciones al
manipular las variables del lado izquierdo y derecho de la sentencia. Con respecto al
lado izquierdo, se utiliza el nombre de la variable para acceder a la celda de la memoria
que éste referencia, con el objetivo de almacenar el dato obtenido desde el lado derecho.
Para esto, la variable del lado derecho debe sufrir una extracción de valor
(Desreferencing).
Veamos un ejemplo de un programa simple, codificado en lenguaje C:
Ejemplo 1
Puede observarse la existencia de los datos, ya que la sentencia de incremento en
b no tuvo ningún efecto 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);
}
EE ED
14
26ha
10
22hb
EE ED
10
26ha
10
22hb
EE ED
10
26ha
11
22hb
El valor de a es 10
El valor de b es 11
Lenguajes de Programación I
Apunte: Asignaciones
-4-
Veamos ahora dos ejemplos similares codificados en lenguaje Java:
Ejemplo 2
º
Puede observarse la existencia de los datos, ya que la sentencia de incremento en
b no tuvo ningún efecto 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);
}
14
48ha
10
40hb
10
48ha
10
40hb
10
48ha
11
40hb
Lenguajes de Programación I
Apunte: Asignaciones
-5-
Ejemplo 3
En el segundo caso, cuando se utilizó objetos de tipo “Entero”, puede observarse
que el comportamiento de la sentencia de asignación es diferente: en este caso no hubo
copia del valor de la variable sino de su referencia, ya que de lo contrario la sentencia de
incremento de b no hubiese afectado 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);
}
Numero=14
48ha 1
40hb
Numero=10
1
Numero=14
48ha 0
40hb
Numero=10
2
a
40hb
Numero=11
2
Numero=14
48h 0GARBAGE
COLECTOR
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
Lenguajes de Programación I
Apunte: Asignaciones
-6-
Esquemas de Asignación:
Asignaciones por copia y Asignaciones por referencia
De los ejemplos precedentes puede concluirse que las sentencias de asignación
tienen una semántica diferente entre los primeros dos ejemplos y el tercero. Esto se debe
a que el mecanismo de asignación en cada caso es distinto. Punto que profundizaremos
a continuación.
Asignaciones por copia
El esquema de asignaciones entre variables por copia de valores funciona de la
siguiente manera:
Sobre la variable del lado derecho de la sentencia se realiza una extracción del
valor almacenado en la celda de memoria. Luego, este valor es copiado en la celda de
memoria correspondiente a la variable del lado izquierdo de la sentencia.
Como consecuencia, la única relación entre ambos datos es que –en este punto del
programa- contienen el mismo valor en sus respectivas celdas de memoria. Ambos
datos continúan siendo entidades completamente independientes, por lo cual cualquier
cambio en uno de ellos NO produce ningún efecto sobre el otro.
Este esquema de asignación puede ser observado en los primeros dos ejemplos.
Asignaciones por referencia
El esquema de asignaciones entre variables por referencia funciona de la siguiente
manera:
Sobre la variable del lado derecho de la sentencia se realiza una extracción de la
dirección de memoria (referencia) donde se halla almacenado su valor. Luego, este
valor de dirección es copiado en la referencia correspondiente a la variable del lado
izquierdo de la sentencia.
Como consecuencia, ambos nombres de variables referencian a la misma
dirección de memoria y, por ende, al mismo dato. Con lo cual, cualquier cambio a ser
realizado a este dato puede efectuarse por medio de cualquiera de los dos nombres. Esta
situación es conocida como “generación de alias”.
Existe otra consecuencia importante que debemos analizar:
¿Qué sucede con el dato que referenciaba originalmente la variable del lado
izquierdo de la asignación? La respuesta es simple:
Si no existe ninguna otra variable que lo referencie, se convierte en un bloque de
memoria utilizado pero inaccesible, es decir “garbage”. Por lo tanto, la generación de
garbage es un riesgo que se corre cuando se utiliza este esquema de asignaciones entre
variables.
Este esquema de asignación puede ser observado en el ejemplo número 3.
Lenguajes de Programación I
Apunte: Asignaciones
-7-
Analogía con esquemas de pasaje de parámetros
Resulta claro apreciar que existe una fuerte similitud entre estos esquemas de
asignaciones entre variables y dos tipos de pasajes de parámetros. A saber: Pasaje de
Parámetros por Copia-Valor y Pasaje de Parámetros por Referencia, respectivamente.
Fig. 2: Relación análoga entre pasaje de parámetros y asignaciones entre variables.
Conclusiones
Es posible concluir que ambos esquemas poseen beneficios y perjuicios. En el
caso del lenguaje C que, como vimos, utiliza un esquema de asignaciones por copia
también es posible asignar referencias si así se desea. Esto debe hacerse de manera
explícita, utilizando punteros del lado izquierdo de la sentencia y por medio del
operador de extracción de referencias (&) en el lado derecho (Ver fig. 3). C++, por
ejemplo, incorpora un mecanismo de generación de alias a través de la definición del
tipo de dato “referencia” (Ver fig. 4).
Generalmente, los lenguajes dinámicos orientados a objetos tienden a utilizar el
esquema de asignaciones entre variables por referencia. Esto se debe a que un objeto es
un dato bastante más complejo que una variable entera, pues no solo posee datos sino
también métodos. Con lo cual, utilizar este esquema resulta más flexible.
[…]
int a=10;
int *pun;
pun= &a; //Asignación de la dirección de ‘a’ en ‘pun’.
[…]
Fig. 3: Asignación de referencias explícita en C.
[…]
int a=10;
int &ref_a=a; //Declaración e inicialización de la referencia ‘ref_a’ a ‘a’.
[…]
Fig. 4: Declaración de un alias en C++.
Asignaciones
entre variables
Pasaje de
parámetros
Asignaciones por copia
Asignaciones por
referencia
Pasaje de parámetros
por copia
Pasaje de parámetros
por referencia
Lenguajes de Programación I
Apunte: Asignaciones
-8-
Otras asignaciones
Asignación de una expresión o una constante
En este caso, no existe distinción alguna entre asignación por copia o referencia
ya que las expresiones no tienen referencias. La asignación consiste en calcular el valor
de la expresión situada del lado derecho de la sentencia y almacenarlo en la celda de
memoria referenciada por la variable del lado izquierdo.
Por ejemplo:
[…]
int a;
a = 3 * 4;
[…]
Fig. 5: Asignación de expresiones en C.
El caso de asignación de una constante es análogo.
Asignación de una función
En este caso, si se asignara a la variable del lado izquierdo el puntero a la función
ubicada en el lado derecho, la variable se comportaría como un puntero a la función.
Esto no es un uso común. Lo que se hace es ejecutar la función y, luego, se asigna el
valor resultado a la celda de memoria referenciada por la variable del lado izquierdo de
la sentencia (Asignación por copia).
Por ejemplo:
[…]
int a;
a = maximo(3,6);
[…]
Fig. 5: Asignación del valor de una función en C.
En C, por ejemplo, es posible copiar el puntero de una función pero debe hacerse
en forma explícita hacia una variable de tipo puntero a función.

Más contenido relacionado

La actualidad más candente

Identificadores, variables y constantes
Identificadores, variables y constantesIdentificadores, variables y constantes
Identificadores, variables y constantesCarlos Pes
 
Estructura sintactica de los lenguajes de programacion y bases de datos
Estructura sintactica de los lenguajes de programacion y bases de datosEstructura sintactica de los lenguajes de programacion y bases de datos
Estructura sintactica de los lenguajes de programacion y bases de datosspedy93
 
Variables y Constantes en C++
Variables y Constantes en C++Variables y Constantes en C++
Variables y Constantes en C++ivanjvic
 
Elementos Basicos del Lenguaje C++
Elementos Basicos del Lenguaje C++Elementos Basicos del Lenguaje C++
Elementos Basicos del Lenguaje C++yesid19
 
Introducción a C++
Introducción a C++Introducción a C++
Introducción a C++Areli1215
 
Constante y variable
Constante y variableConstante y variable
Constante y variableAnthony Vera
 
Algoritmos y lenjuage de programacion
Algoritmos y  lenjuage de programacionAlgoritmos y  lenjuage de programacion
Algoritmos y lenjuage de programacionYsaac Ruiz
 
Programacion ii modulo2-leccion3
Programacion ii modulo2-leccion3Programacion ii modulo2-leccion3
Programacion ii modulo2-leccion3karlalopezbello
 
Tema 1-2 identificadores - variable y constante
Tema 1-2 identificadores - variable y constanteTema 1-2 identificadores - variable y constante
Tema 1-2 identificadores - variable y constanteRufi Flores
 
Lenguaje de programacion c++ basico 1ra parte elementos basicos del lenguaje
Lenguaje de programacion c++ basico 1ra parte elementos basicos del lenguajeLenguaje de programacion c++ basico 1ra parte elementos basicos del lenguaje
Lenguaje de programacion c++ basico 1ra parte elementos basicos del lenguajeDunkherz
 
Estructura De Un Programa
Estructura De Un ProgramaEstructura De Un Programa
Estructura De Un ProgramaLisb
 
Compu1 (1)
Compu1 (1)Compu1 (1)
Compu1 (1)jbersosa
 
Curso lenguaje c_segundo_modulo_
Curso lenguaje c_segundo_modulo_Curso lenguaje c_segundo_modulo_
Curso lenguaje c_segundo_modulo_Jennybeatriz1
 
Entrada y salida de datos en c
Entrada y salida de datos en cEntrada y salida de datos en c
Entrada y salida de datos en cDenisse C
 
Republica bolivariana de venezuela
Republica bolivariana de venezuelaRepublica bolivariana de venezuela
Republica bolivariana de venezuelaroyimar
 
C# documento de texto junto con mapa conceptual
C# documento de texto junto con mapa conceptualC# documento de texto junto con mapa conceptual
C# documento de texto junto con mapa conceptualFernando Jose
 
Introduccion al lenguaje c
Introduccion al lenguaje cIntroduccion al lenguaje c
Introduccion al lenguaje cMaylin25
 

La actualidad más candente (20)

Identificadores, variables y constantes
Identificadores, variables y constantesIdentificadores, variables y constantes
Identificadores, variables y constantes
 
Estructura sintactica de los lenguajes de programacion y bases de datos
Estructura sintactica de los lenguajes de programacion y bases de datosEstructura sintactica de los lenguajes de programacion y bases de datos
Estructura sintactica de los lenguajes de programacion y bases de datos
 
Variables y Constantes en C++
Variables y Constantes en C++Variables y Constantes en C++
Variables y Constantes en C++
 
Introduccion c
Introduccion cIntroduccion c
Introduccion c
 
Elementos Basicos del Lenguaje C++
Elementos Basicos del Lenguaje C++Elementos Basicos del Lenguaje C++
Elementos Basicos del Lenguaje C++
 
Introducción a C++
Introducción a C++Introducción a C++
Introducción a C++
 
Constante y variable
Constante y variableConstante y variable
Constante y variable
 
Algoritmos y lenjuage de programacion
Algoritmos y  lenjuage de programacionAlgoritmos y  lenjuage de programacion
Algoritmos y lenjuage de programacion
 
Programacion ii modulo2-leccion3
Programacion ii modulo2-leccion3Programacion ii modulo2-leccion3
Programacion ii modulo2-leccion3
 
Tema 1-2 identificadores - variable y constante
Tema 1-2 identificadores - variable y constanteTema 1-2 identificadores - variable y constante
Tema 1-2 identificadores - variable y constante
 
Lenguaje de programacion c++ basico 1ra parte elementos basicos del lenguaje
Lenguaje de programacion c++ basico 1ra parte elementos basicos del lenguajeLenguaje de programacion c++ basico 1ra parte elementos basicos del lenguaje
Lenguaje de programacion c++ basico 1ra parte elementos basicos del lenguaje
 
Estructura De Un Programa
Estructura De Un ProgramaEstructura De Un Programa
Estructura De Un Programa
 
Compu1 (1)
Compu1 (1)Compu1 (1)
Compu1 (1)
 
Curso lenguaje c_segundo_modulo_
Curso lenguaje c_segundo_modulo_Curso lenguaje c_segundo_modulo_
Curso lenguaje c_segundo_modulo_
 
Entrada y salida de datos en c
Entrada y salida de datos en cEntrada y salida de datos en c
Entrada y salida de datos en c
 
Semantico.apun
Semantico.apunSemantico.apun
Semantico.apun
 
Cod intermedio
Cod intermedioCod intermedio
Cod intermedio
 
Republica bolivariana de venezuela
Republica bolivariana de venezuelaRepublica bolivariana de venezuela
Republica bolivariana de venezuela
 
C# documento de texto junto con mapa conceptual
C# documento de texto junto con mapa conceptualC# documento de texto junto con mapa conceptual
C# documento de texto junto con mapa conceptual
 
Introduccion al lenguaje c
Introduccion al lenguaje cIntroduccion al lenguaje c
Introduccion al lenguaje c
 

Similar a Creacion2.

Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTEREMMAFLORESCARMONA
 
Introducción a los algoritmos
Introducción a los algoritmosIntroducción a los algoritmos
Introducción a los algoritmosrulo182
 
Programacion en java_inicio apeuntes para ems
Programacion en java_inicio apeuntes para emsProgramacion en java_inicio apeuntes para ems
Programacion en java_inicio apeuntes para emsCBTis
 
Apuntadores y direccionamiento
Apuntadores y direccionamientoApuntadores y direccionamiento
Apuntadores y direccionamientoSergio Ramos
 
Proyecto final de curso
Proyecto final de cursoProyecto final de curso
Proyecto final de cursoAndreaPaz124
 
Identificadores variables y constates en pseudocódigo
Identificadores variables y constates en pseudocódigoIdentificadores variables y constates en pseudocódigo
Identificadores variables y constates en pseudocódigoAbrirllave
 
Trabajo programacion 1 jose silva
Trabajo programacion 1 jose silvaTrabajo programacion 1 jose silva
Trabajo programacion 1 jose silvaJhosse Ant Siilva
 
FORMATO DIAPOSITIVAS - dart y flutter.pptx
FORMATO DIAPOSITIVAS - dart y flutter.pptxFORMATO DIAPOSITIVAS - dart y flutter.pptx
FORMATO DIAPOSITIVAS - dart y flutter.pptxEMMAFLORESCARMONA
 
37 tarazona karen programacion
37 tarazona karen programacion37 tarazona karen programacion
37 tarazona karen programacionkarenyulithza
 
Taller analisis semantico
Taller analisis semanticoTaller analisis semantico
Taller analisis semanticoAlvaro Cedeño
 
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptxConceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptxgalletasdecoco84
 
Variables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeIntVariables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeIntCristian C
 

Similar a Creacion2. (20)

Programacion
ProgramacionProgramacion
Programacion
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTER
 
Segundo trabajo
Segundo trabajoSegundo trabajo
Segundo trabajo
 
Introducción a los algoritmos
Introducción a los algoritmosIntroducción a los algoritmos
Introducción a los algoritmos
 
Programacion en java_inicio apeuntes para ems
Programacion en java_inicio apeuntes para emsProgramacion en java_inicio apeuntes para ems
Programacion en java_inicio apeuntes para ems
 
Apuntadores y direccionamiento
Apuntadores y direccionamientoApuntadores y direccionamiento
Apuntadores y direccionamiento
 
Proyecto final de curso
Proyecto final de cursoProyecto final de curso
Proyecto final de curso
 
Mod2ud1 2
Mod2ud1 2Mod2ud1 2
Mod2ud1 2
 
Identificadores variables y constates en pseudocódigo
Identificadores variables y constates en pseudocódigoIdentificadores variables y constates en pseudocódigo
Identificadores variables y constates en pseudocódigo
 
Trabajo programacion 1 jose silva
Trabajo programacion 1 jose silvaTrabajo programacion 1 jose silva
Trabajo programacion 1 jose silva
 
FORMATO DIAPOSITIVAS - dart y flutter.pptx
FORMATO DIAPOSITIVAS - dart y flutter.pptxFORMATO DIAPOSITIVAS - dart y flutter.pptx
FORMATO DIAPOSITIVAS - dart y flutter.pptx
 
Ensayo php
Ensayo phpEnsayo php
Ensayo php
 
37 tarazona karen programacion
37 tarazona karen programacion37 tarazona karen programacion
37 tarazona karen programacion
 
Practica2
Practica2Practica2
Practica2
 
Taller analisis semantico
Taller analisis semanticoTaller analisis semantico
Taller analisis semantico
 
Taller 2 conceptualizacion
Taller 2 conceptualizacionTaller 2 conceptualizacion
Taller 2 conceptualizacion
 
Victorleyva eje 4_actividad1
Victorleyva eje 4_actividad1Victorleyva eje 4_actividad1
Victorleyva eje 4_actividad1
 
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptxConceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
Conceptos-HTML-y-JavaScript-Bloque-3-JavaScript.pptx
 
Java
JavaJava
Java
 
Variables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeIntVariables, expresiones y ejecución de condiciones les en PSeInt
Variables, expresiones y ejecución de condiciones les en PSeInt
 

Creacion2.

  • 1. Lenguajes de Programación I Asignaciones Ayud. Mezzanotte, Martín Lenguajes de Programación I - Cursada 2006 - Ingeniería de Sistemas Facultad de Ciencias Exactas Universidad Nacional del Centro de la Provincia de Buenos Aires
  • 2. Lenguajes de Programación I Apunte: Asignaciones -1- Lenguajes de Programación I Asignaciones Objetivos • Ejemplificar situaciones de asignación en esquemas de asignación por copia de valores. • Ejemplificar situaciones de asignación en esquemas de asignación por copia de referencias. • Analizar situaciones análogas entre asignaciones y pasajes de parámetros. • Exponer relaciones conceptuales importantes entre las asignaciones y otros temas relevantes de la materia, como por ejemplo: Administración de memoria, diferencias y similitudes entre lenguajes dinámicos orientados a objetos y lenguajes tipo Algol, entre otros. Temario Variables • Distinción entre Valor, Referencia y Nombre. Asignaciones entre variables • Concepto: ¿Qué sucede en la sentencia “a:=b”? • Ejemplificación en lenguaje C: Orientado a asignación por copia. • Ejemplificación en lenguaje Java: Orientado a asignación por referencia. • Comparación entre ambos esquemas de asignación: o Existencia de ambos datos en asignaciones por copia. o Creación de alias y generación de garbage en asignaciones por referencia. o Similitud con los esquemas de pasajes de parámetros • Asignación por referencia explícita (Lenguaje C) e implícita (Lenguajes dinámicos orientados a objetos). Otras Asignaciones • Asignaciones con expresiones. • Asignaciones con funciones. • Asignaciones con constantes.
  • 3. Lenguajes de Programación I Apunte: Asignaciones -2- Variables Concepto de Variable: Valor, Referencia y Nombre En primer lugar, recordaremos algunos conceptos importantes con respecto al manejo de variables. De cada variable es posible distinguir: Su valor. Es decir, el dato que se almacena en la variable. Su referencia. O sea, la dirección de memoria donde está almacenado el valor de la variable. Su nombre. Es decir, un identificador que permite referenciar en lenguaje natural una dirección de almacenamiento. De esta forma, podemos entender las variables como ternas de la siguiente forma: Fig. 1: Representación de una variable. Por ejemplo: VALOR Dirección Nombre void main(){ int a=14; […] } EE ED 14 26ha
  • 4. Lenguajes de Programación I Apunte: Asignaciones -3- Asignaciones entre variables Concepto de Asignación: ¿Qué sucede en la sentencia "a:=b”? Es importante entender correctamente qué tratamiento lleva a cabo el lenguaje de una sentencia de asignación: En una asignación entre dos variables, el lenguaje realiza diferentes acciones al manipular las variables del lado izquierdo y derecho de la sentencia. Con respecto al lado izquierdo, se utiliza el nombre de la variable para acceder a la celda de la memoria que éste referencia, con el objetivo de almacenar el dato obtenido desde el lado derecho. Para esto, la variable del lado derecho debe sufrir una extracción de valor (Desreferencing). Veamos un ejemplo de un programa simple, codificado en lenguaje C: Ejemplo 1 Puede observarse la existencia de los datos, ya que la sentencia de incremento en b no tuvo ningún efecto 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); } EE ED 14 26ha 10 22hb EE ED 10 26ha 10 22hb EE ED 10 26ha 11 22hb El valor de a es 10 El valor de b es 11
  • 5. Lenguajes de Programación I Apunte: Asignaciones -4- Veamos ahora dos ejemplos similares codificados en lenguaje Java: Ejemplo 2 º Puede observarse la existencia de los datos, ya que la sentencia de incremento en b no tuvo ningún efecto 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); } 14 48ha 10 40hb 10 48ha 10 40hb 10 48ha 11 40hb
  • 6. Lenguajes de Programación I Apunte: Asignaciones -5- Ejemplo 3 En el segundo caso, cuando se utilizó objetos de tipo “Entero”, puede observarse que el comportamiento de la sentencia de asignación es diferente: en este caso no hubo copia del valor de la variable sino de su referencia, ya que de lo contrario la sentencia de incremento de b no hubiese afectado 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); } Numero=14 48ha 1 40hb Numero=10 1 Numero=14 48ha 0 40hb Numero=10 2 a 40hb Numero=11 2 Numero=14 48h 0GARBAGE COLECTOR 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
  • 7. Lenguajes de Programación I Apunte: Asignaciones -6- Esquemas de Asignación: Asignaciones por copia y Asignaciones por referencia De los ejemplos precedentes puede concluirse que las sentencias de asignación tienen una semántica diferente entre los primeros dos ejemplos y el tercero. Esto se debe a que el mecanismo de asignación en cada caso es distinto. Punto que profundizaremos a continuación. Asignaciones por copia El esquema de asignaciones entre variables por copia de valores funciona de la siguiente manera: Sobre la variable del lado derecho de la sentencia se realiza una extracción del valor almacenado en la celda de memoria. Luego, este valor es copiado en la celda de memoria correspondiente a la variable del lado izquierdo de la sentencia. Como consecuencia, la única relación entre ambos datos es que –en este punto del programa- contienen el mismo valor en sus respectivas celdas de memoria. Ambos datos continúan siendo entidades completamente independientes, por lo cual cualquier cambio en uno de ellos NO produce ningún efecto sobre el otro. Este esquema de asignación puede ser observado en los primeros dos ejemplos. Asignaciones por referencia El esquema de asignaciones entre variables por referencia funciona de la siguiente manera: Sobre la variable del lado derecho de la sentencia se realiza una extracción de la dirección de memoria (referencia) donde se halla almacenado su valor. Luego, este valor de dirección es copiado en la referencia correspondiente a la variable del lado izquierdo de la sentencia. Como consecuencia, ambos nombres de variables referencian a la misma dirección de memoria y, por ende, al mismo dato. Con lo cual, cualquier cambio a ser realizado a este dato puede efectuarse por medio de cualquiera de los dos nombres. Esta situación es conocida como “generación de alias”. Existe otra consecuencia importante que debemos analizar: ¿Qué sucede con el dato que referenciaba originalmente la variable del lado izquierdo de la asignación? La respuesta es simple: Si no existe ninguna otra variable que lo referencie, se convierte en un bloque de memoria utilizado pero inaccesible, es decir “garbage”. Por lo tanto, la generación de garbage es un riesgo que se corre cuando se utiliza este esquema de asignaciones entre variables. Este esquema de asignación puede ser observado en el ejemplo número 3.
  • 8. Lenguajes de Programación I Apunte: Asignaciones -7- Analogía con esquemas de pasaje de parámetros Resulta claro apreciar que existe una fuerte similitud entre estos esquemas de asignaciones entre variables y dos tipos de pasajes de parámetros. A saber: Pasaje de Parámetros por Copia-Valor y Pasaje de Parámetros por Referencia, respectivamente. Fig. 2: Relación análoga entre pasaje de parámetros y asignaciones entre variables. Conclusiones Es posible concluir que ambos esquemas poseen beneficios y perjuicios. En el caso del lenguaje C que, como vimos, utiliza un esquema de asignaciones por copia también es posible asignar referencias si así se desea. Esto debe hacerse de manera explícita, utilizando punteros del lado izquierdo de la sentencia y por medio del operador de extracción de referencias (&) en el lado derecho (Ver fig. 3). C++, por ejemplo, incorpora un mecanismo de generación de alias a través de la definición del tipo de dato “referencia” (Ver fig. 4). Generalmente, los lenguajes dinámicos orientados a objetos tienden a utilizar el esquema de asignaciones entre variables por referencia. Esto se debe a que un objeto es un dato bastante más complejo que una variable entera, pues no solo posee datos sino también métodos. Con lo cual, utilizar este esquema resulta más flexible. […] int a=10; int *pun; pun= &a; //Asignación de la dirección de ‘a’ en ‘pun’. […] Fig. 3: Asignación de referencias explícita en C. […] int a=10; int &ref_a=a; //Declaración e inicialización de la referencia ‘ref_a’ a ‘a’. […] Fig. 4: Declaración de un alias en C++. Asignaciones entre variables Pasaje de parámetros Asignaciones por copia Asignaciones por referencia Pasaje de parámetros por copia Pasaje de parámetros por referencia
  • 9. Lenguajes de Programación I Apunte: Asignaciones -8- Otras asignaciones Asignación de una expresión o una constante En este caso, no existe distinción alguna entre asignación por copia o referencia ya que las expresiones no tienen referencias. La asignación consiste en calcular el valor de la expresión situada del lado derecho de la sentencia y almacenarlo en la celda de memoria referenciada por la variable del lado izquierdo. Por ejemplo: […] int a; a = 3 * 4; […] Fig. 5: Asignación de expresiones en C. El caso de asignación de una constante es análogo. Asignación de una función En este caso, si se asignara a la variable del lado izquierdo el puntero a la función ubicada en el lado derecho, la variable se comportaría como un puntero a la función. Esto no es un uso común. Lo que se hace es ejecutar la función y, luego, se asigna el valor resultado a la celda de memoria referenciada por la variable del lado izquierdo de la sentencia (Asignación por copia). Por ejemplo: […] int a; a = maximo(3,6); […] Fig. 5: Asignación del valor de una función en C. En C, por ejemplo, es posible copiar el puntero de una función pero debe hacerse en forma explícita hacia una variable de tipo puntero a función.