Está en la página 1de 41

Unidad 6:

Expresiones y
Sentencias de Asignación
Estructura de los Lenguajes

Lic. en Ciencias Informáticas


Facultad Politécnica, Universidad Nacional de Asunción
Notas de lectura revisadas y adaptadas por los profesores:
• Prof. Derlis Zárate (dzarate@pol.una.py) • Prof. Gerardo González (jggonzalez@pol.una.py)
• Prof. Milciades Fernández (mfernandez@pol.una.py) • Prof. Saúl Zalimben (szalimben@pol.una.py)
Índice
1. Introducción
2. Expresiones
Expresiones aritméticas
Cuestiones de diseño, precedencia y asociatividad
Efectos colaterales (side effects)
Sobrecarga de operadores
Conversiones de tipos
Expresiones relacionales y booleanas
Evaluación en corto-circuito, estricta (eager) y perezosa (lazy)
3. Sentencias de asignación y asignaciones en modo mixto
4. Conclusiones
5. Bibliografía y referencias
Introducción
Sección 1
Introducción
Wirth, 1976:

Algoritmos + Estructuras de Datos = Programas

Datos .. estructuras de datos

Manipulados por estructuras


de control... algoritmos
Generan resultado
La manera en que un lenguaje de programación expresa los datos y el
control, determina significativamente cómo se escriben los programas en él.
Unidad 6: Expresiones y Sentencias de Asignación 4
Introducción
• Las expresiones y sentencias de asignación son el
fundamento que nos permite especificar
cómputos en un lenguaje de programación,
principalmente en los imperativos.
– Para entender la evaluación de las expresiones,
necesitamos familiarizarnos con el orden de los
operadores y evaluación de operandos.

Unidad 6: Expresiones y Sentencias de Asignación 5


Expresiones
Sección 2
Expresiones Aritméticas
• La evaluación aritmética fue una de las
motivaciones para el desarrollo de los
primeros lenguajes de programación.
• Las expresiones aritméticas consisten en
operadores, operandos, paréntesis y
llamadas a funciones.

Unidad 6: Expresiones y Sentencias de Asignación 7


Cuestiones de Diseño
• Expresiones Aritméticas
– Reglas de precedencia de los operadores?
– Reglas de asociatividad de los operadores?
– Orden de evaluación de los operandos?
– Side effects de la evaluación de operadores?
– Sobrecarga de operadores?
– Mezcla de tipos en expresiones?

Unidad 6: Expresiones y Sentencias de Asignación 8


Reglas de Precedencia de Operadores
• Las reglas de precedencia de operadores
definen el orden en el cual operadores
“adyacentes” de diferentes niveles de
precedencia son evaluados.
• Niveles de precedencia típicos
– paréntesis
– Operadores unarios
– ** (si el lenguaje lo soporta)
– *, /
– +, -

Unidad 6: Expresiones y Sentencias de Asignación 9


Reglas de Asociatividad de Operadores
• Las reglas de asociatividad de operadores para la
evaluación de expresiones define el orden en el
cual operadores adyacentes con el mismo nivel de
precedencia son evaluados.
• Reglas de asociatividad típicas
– Izquierda a Derecha, excepto **, el cual es derecha a
izquierda.
– A veces, los operadores unarios se asocian derecha a
izquierda (ej. FORTRAN)
• Las reglas de precedencias y asociatividad pueden
sobreescribirse con paréntesis.

Unidad 6: Expresiones y Sentencias de Asignación 10


Expresiones Aritméticas: Condicionales
• Expresiones Condicionales
– Lenguajes basados en C (C, C++)
– Ejemplo:
average = (count == 0) ? 0 : sum / count

– Evalúa como if si se escribe como


if (count == 0)
average = 0
else
average = sum /count

Unidad 6: Expresiones y Sentencias de Asignación 11


Orden de Evaluación de Operandos
1. Variables: se obtiene el valor de la memoria
2. Constantes: a veces, se obtiene de la memoria,
a veces es una instrucción de lenguaje
máquina
3. Expresiones con paréntesis: evalúan todos los
operandos y operadores primeros
4. El caso más interesante es cuando un
operando es una llamada a función

Unidad 6: Expresiones y Sentencias de Asignación 12


Efectos Colaterales o Side Effects
• Las expresiones aritméticas son potenciales para
generar side effects funcionales.
• Side effects funcionales: cuando una función
cambia un parámetro in-out (E/S) o una variable no
local.
• Problema con side effects funcionales:
– Cuando una función referenciada en una expresión altera
otro operando de la expresión, ejemplo: para el
parámetro a:
a = 10;
/* asumimos que fun cambia su parámetro */
b = a + fun(&a);
Unidad 6: Expresiones y Sentencias de Asignación 13
Ejemplo de Side Effect
• Ejemplo
class Order
{ static int x = 1;
public static int getX()
{ return x++; }
public static void main(String[] args)
{ System.out.println( x+getX() ); }
}

Esto imprime 2 en Java, pero si lo compilamos en otro lenguaje,


puede que imprima otro valor.

Unidad 6: Expresiones y Sentencias de Asignación 14


Side Effects: posibles soluciones
• Dos posibles soluciones al problema

1. Escribir la definición del lenguaje para desactivar los


side efects funcionales
• No permitir parámetros in-out
• No permitir referencias no locales en funciones
• Ventaja: funciona
• Desventaja: inflexibilidad de parámetros solo in y
pérdida de referencias no locales.

2. Escribir la definición del lenguaje para asegurar que el


orden de la evaluación de operandos sea correcto

Unidad 6: Expresiones y Sentencias de Asignación 15


Operadores Sobrecargados
• El uso de un operador para más de un
propósito se conoce como sobrecarga de
operadores.
• Algunos son conocidos (ejemplo: + para
int y float)
• Algunos son problemas potenciales
(ejemplo: * en C y C++)
– Pérdida de detección de errores del compilador
– Alguna pérdida de legibilidad

Unidad 6: Expresiones y Sentencias de Asignación 16


Operadores Sobrecargados
• C++ y C# permiten al usuario sobrecargar
los operadores
• Problemas potenciales:
– Los usuarios pueden definir operaciones sin
sentido
– La legibilidad sufriría problemas

Unidad 6: Expresiones y Sentencias de Asignación 17


Conversión de Tipos
• Una conversión limitante (narrowing
conversion) es una conversión que
convierte un objeto a un tipo que no puede
incluir todos los valores del tipo original.
Ejemplo: float a int
• Una conversión amplia (widening
conversion) es una en la cual un objeto se
convierte a un tipo que puede incluir todos
los valores del tipo original. Ejemplo: int a
float
Unidad 6: Expresiones y Sentencias de Asignación 18
Conversión de Tipos: Modo Mixto
• Una expresión en modo mixto es una en la cual
existen operandos de diferentes tipos
• Una coerción es una conversión implícita de un
tipo.
• En varios lenguajes, todos los tipos numéricos se
coercen en las expresiones, usando conversiones
amplias.

Unidad 6: Expresiones y Sentencias de Asignación 19


Conversiones de Tipo Explícitas
• Llamado casting en lenguajes basados en
C.
• Ejemplos
– C: (int)angle
– Ada: Float (Sum)

Unidad 6: Expresiones y Sentencias de Asignación 20


Conversiones de Tipos: Errores en Expresiones
• Causas
– Limitaciones inherentes de la aritmética
Ejemplo: división por cero
– Limitaciones del cómputo aritmético
Ejemplo: overflow

Unidad 6: Expresiones y Sentencias de Asignación 21


Expresiones Relacionales y Booleanas
• Expresiones Relacionales
– Usa operadores relacionales y operandos de
varios tipos
– Evalúa a alguna representación Booleana
– Los símbolos de operadores utilizados varían
entre los lenguajes (!=, /=, ~=, .NE., <>, #)
• JavaScript y PHP tienen dos operadores
relacionales adicionales === y !==
- Similar a sus primos == y !=, excepto que ellos
no coercen sus operandos
Unidad 6: Expresiones y Sentencias de Asignación 22
Expresiones Relacionales y Booleanas
• Expresiones Booleanas
– Los operandos son booleanos y el resultado
también es booleano
– Ejemplos de operadores

FORTRAN 77 FORTRAN 90 C Ada


.AND. and && and
.OR. or || or
.NOT. not ! not
xor
Unidad 6: Expresiones y Sentencias de Asignación 23
Expresiones Relacionales y Booleanas: Caso Lenguaje C
• C no tiene tipo Booleano, utiliza int con 0 para
falso y cualquier valor distinto de 0 como
verdadero
• Una característica rara de las expresiones en C:
• a < b < c es una expresión válida, pero el
resultado podría no ser el esperado:
– El operador de la izquierda es evaluado, produciendo 0
o 1.
– El resultado de la evaluación es luego comparado con
el tercer operando.
Unidad 6: Expresiones y Sentencias de Asignación 24
Evaluación en Corto Circuito
• Una expresión en la cual el resultado es
determinado sin evaluar todos los
operandos y/o operadores
• Ejemplo: (13*a) * (b/13–1)
Si a es cero, no es necesario evaluar
(b/13-1)

Unidad 6: Expresiones y Sentencias de Asignación 25


Evaluación en Corto Circuito
• C, C++, y Java: usan evaluación en corto circuito
para los operadores usuales booleanos (&& y ||),
pero también proveen operadores booleanos a
nivel de bits que no se evalúan en corto circuito (&
y |)
• Ada: el programador puede especificar si desea o
no evaluar en corto circuito (corto circuito se
especifica con “and then” y “or else”)

Unidad 6: Expresiones y Sentencias de Asignación 26


Evaluaciones estrictas y perezosas
• El orden de evaluación de una expresión es estricto si todas las
subexpresiones de la expresión son evaluadas.
– Independientemente a si son o no necesarias para obtener el
resultado final.
• En caso contrario es no estricto.
• Cada lenguaje tiene al menos algún conjunto pequeño de
expresiones no estrictas (?:, &&, || en Java).
• Algunos lenguajes usan una forma no estricta llamada
evaluación de orden normal en la cual ninguna expresión es
evaluada hasta que sea necesaria. También conocido como
evaluación retrasada o evaluación perezosa
• Sin importar si es o no estricto, puede ser evaluado de derecha
a izquierda o viceversa.
Unidad 6: Expresiones y Sentencias de Asignación 27
Sentencias de Asignación
Sección 3
Sentencias de Asignación
• Sintaxis general
<target_var> <assign_operator> <expression>
• El operador de asignación
= FORTRAN, BASIC, C-based languages
:= ALGOLs, Pascal, Ada

= puede ser malo si es sobrecargado para los


operadores relacionales de igualdad (por eso
es que en los lenguajes basados en C se usa
== como operador relacional)
Unidad 6: Expresiones y Sentencias de Asignación 29
Sentencias de Asignación: Targets Condicionales
• Targets condicionales (Perl)
($flag ? $total : $subtotal) = 0

El cual es equivalente a

if ($flag){
$total = 0
} else {
$subtotal = 0
}

Unidad 6: Expresiones y Sentencias de Asignación 30


Sentencias de Asignación: Operadores Compuestos
• Un método para especificar formas de
asignación comúnmente requeridas.
– Introducidas en ALGOL; adoptadas por C

• Ejemplo:
a = a + b

Se escribe como:
a += b

Unidad 6: Expresiones y Sentencias de Asignación 31


Operadores Unarios de Asignación
• Los operadores unarios de asignación en los
lenguajes basados en C combinan el
incremento y decremento con asignaciones
• Ejemplos:
sum = ++count
sum = count++
count++
-count++

Unidad 6: Expresiones y Sentencias de Asignación 32


Asignaciones como Expresiones
• En C, C++, y Java, la sentencia de
asignación produce un resultado que puede
ser utilizado como operando
• Un ejemplo:
while ((ch = getchar())!= EOF){…}

ch = getchar() se ejecuta; el resultado se


asigna a ch y se usa como valor condicional
en la sentencia while
Unidad 6: Expresiones y Sentencias de Asignación 33
Asignaciones de Listas
• Perl y Ruby soportan asignaciones de listas.
Ejemplo:
($first, $second, $third) = (20, 30, 40);

Unidad 6: Expresiones y Sentencias de Asignación 34


Asignaciones en Modo Mixto
• Las sentencias de asignación también
pueden estar en modo mixto
• En Fortran, C, y C++, cualquier valor de
tipo numérico puede asignarse a
cualquier variable de tipo numérico.
• En Java, solo coerciones con asignaciones
amplias se realizan.
• En Ada, no hay coercion en la asignación.

Unidad 6: Expresiones y Sentencias de Asignación 35


Conclusiones
Sección 4
Conclusiones
• Las expresiones y sentencias de asignación son el fundamento que nos permite
especificar cómputos en un lenguaje de programación.
• Las expresiones aritméticas permiten indicar cómputo y entre las principales cuestiones
de diseño hay:
• Reglas de precedencia
• Reglas de asociatividad
• Resolución de sobrecarga
• Efectos colaterales
• Conversiones de tipos
• Evaluación: en corto circuito, estricta o perezosa
• Las expresiones relacionales y booleanas se usan principalmente como condicionales en
conjunto con estructuras de control.
• Una sentencias de asignación permite almacenar el resultado de la evaluación de una
expresión, en celdas de memoria.

Unidad 6: Expresiones y Sentencias de Asignación 37


Bibliografía y referencias
Sección 5
Bibliografía y referencias adicionales
El contenido de estas notas de lectura está basado en los libros de textos oficiales de la materia:
• Lenguajes de Programación, principios y prácticas. Kenneth C. Louden.
Ed. Thompson, 2da Edición. Capítulo 7.
• Concepts of Programming Languages. Robert W. Sebesta.
Ed. Addison Wesley, 5ta Edición. Capítulo 7.

Y fue adaptado por los profesores:


• Derlis Zárate (dzarate@pol.una.py)
• Juan Gerardo González (jggonzalez@pol.una.py)
• Milciades Ramón Fernández González (mfernandez@pol.una.py)
• Saúl Zalimben (szalimben@pol.una.py)

Unidad 6: Expresiones y Sentencias de Asignación 39


¿Consultas? ¿Dudas?
Puedes escribir tus consultas o dudas en
el Foro de la Unidad 6, que estaremos
respondiendo entre todos.

Unidad 6: Expresiones y Sentencias de Asignación 40


Unidad 6: Expresiones y
Sentencias de Asignación
Fin de la presentación

También podría gustarte