# Fundamentos de programación/Expresiones

* Lección 6
* Expresiones
Las expresiones son combinaciones de constantes, variables y operadores de diferentes tipos que nos permiten manipular datos para obtener información nueva. Los lenguajes de programación usan los mismos conceptos de las operaciones matemáticas tradicionales, tales como el agrupamiento y la precedencia de operadores. Están compuestas de un operando y dos operadores y tienen un valor. El valor de la expresión se obtiene al tomar los valores de los operandos y aplicarles el operador. Los operandos pueden ser constantes, variables u otras expresiones y se clasifican en aritméticos, relacionales, lógicos y de conversión de tipos dependiendo del tipo de los operandos que manipulan y del tipo del valor que regresan.

### Operadores aritméticos

Los operadores aritméticos se aplican sobre números, ya sean reales o enteros y realizan operaciones equivalentes a las operaciones aritméticas básicas. Como se pueden aplicar sobre diferentes tipos de datos, los lenguajes de programación tienen reglas detalladas que permiten determinar el tipo de datos del resultado. En términos generales se pueden resumir de la siguiente forma:
* Si ambos operandos son de tipo entero, el resultado será de tipo entero.
* Si ambos operandos son de tipo real, el resultado será de tipo real.
* Si un operando es real y el otro entero, el operando de tipo entero se convertirá a real y luego se aplicará la operación.
aritméticos más frecuentemente encontrados en los lenguajes de programación:
| Operador | Nombre | Ejemplo de su uso | Resultado de la expresión | Explicación |
| + | Suma | 5 + 7 | 12 | Suma dos números enteros, reales o una combinación de ambos. |
| - | Resta | 12.0 - 5.5 | 6.5 | Resta dos números enteros, reales o una combinación de ambos. |
| - | Negatividad aritmética | -45 | -45 | Cambia el signo de operando de negativo a positivo o viceversa. Usa el mismo símbolo que la operación de resta. |
| * | Multiplicación | 5 * 2.5 | 12.5 | Multiplica dos números enteros, reales o una combinación de ambos. |
| / | División | 10 / 3 | 3 | Resta dos números enteros, reales o una combinación de ambos. Si los dos operandos son enteros el resultado será un número entero y la parte fraccionaria del resultado se descarta. |
| % | Módulo | 10 % 3 | 1 | Operación módulo que regresa el residuo de realizar una división entera entre dos números. |
| ^ | Exponenciación | 5 ^ 2 | 25 | Elevar el primer operando a la segunda potencia indicada en el segundo operando. |
Algunas operaciones matemáticas no están definidas, como por ejemplo la división cuando el segundo operando es cero o la exponenciación cuando la base es cero y el exponente negativo. Cuando los operadores aritméticos reciben parámetros con valores para los cuales no hay una respuesta definida regresan valores especiales o generan un error de tiempo de ejecución y el programa termina abruptamente. En la lección sobre manejo de errores veremos algunas técnicas usadas para controlar este tipo de situaciones.

### Operadores relacionales

Los operadores relacionales permiten realizar comparaciones entre valores de tipos de datos numéricos (como los enteros y los reales) así como entre carácteres. Estos operadores reciben parámetros de tipo numérico o carácter pero su resultado es de tipo lógico. Esto significa que solo regresan uno de dos valores posibles: verdadero si la relación se cumple y falso si la relación no se cumple.
Los siguientes son los operadores relacionales más comunes en los lenguajes de programación:
| Operador | Nombre | Ejemplo de su uso | Resultado de la expresión |
| > | Mayor | 8 > 15 | falso |
| < | Menor | 8 < 15 | verdadero |
| >= | Mayor o igual | 8 >= 8 | verdadero |
| <= | Menor o igual | 8 <= -8</cod200.125.170.134 18:38 25 sep 2023 (UTC)e> | falso |
| = | Igual | 45.0 = 32.0 | falso |
| <> | Diferente | 10 <> 3 | verdadero |
Al comparar carácteres es importante tener en cuenta que los lenguajes de programación normalmente lo hacen comparando el valor numérico asignado a cada letra, dígito o símbolo por lo que los resultados de la operación dependerán del código de carácteres que estemos usando. Por ejemplo, si usamos el código de carácteres ASCII, el carácter D está representado por el código 68 y el carácter d está representado por el código 100. Eso significa que el resultado de ejecutar 'D' < 'd' es el valor lógico verdadero, ya que 68 es menor a 100.
También es importante considerar que al manipular números reales, los operadores relacionales enfrentan restricciones debido a que los computadores representan ese tipo de datos de forma aproximada. Eso provoca que operaciones que desde el punto de vista de la aritmética deberían regresar valores iguales, reporten valores diferentes al usar los operadores relacionales de las computadoras debido a errores de redondeo o representación.

### Operadores lógicos

Los operadores lógicos implementan las principales conectivas de la lógica proposicional. Trabajan con operandos de tipo lógico y los más comunes son la conjunción (y), la disyunción (o) y la negación (no). El operador y tiene valor verdadero si sus dos parámetros son verdaderos y tiene valor falso en los otros casos. El operador o tiene el valor verdadero si alguno de sus operandos es verdadero. El operador no trabaja solamente sobre un operando. Tiene valor verdadero si el operando es falso y tiene valor falso si el operando es verdadero. La siguiente tabla da algunos ejemplos de su uso:
| Operador | Nombre | Ejemplo de su uso | Resultado de la expresión |
| y | Conjunción | verdadero y falso | falso |
| o | Disyunción | verdadero o falso | verdadero |
| no | Negación | no verdadero | falso |

### Asignación de resultados

El operador de asignación se mencionó en la lección anterior. Su función consisten en evaluar una expresión para calcular su valor y asignar ese valor a una variable. Hasta ahora lo hemos usado para asignar valores constantes a las variables, pero también puede usarse para asignar los resultados de evaluar expresiones más complejas como las que hemos visto en esta lección. Estos son algunos ejemplos de ese uso del operador de asignación:
* El operador de asignación calcula el resultado de la expresión 5 + 8 y lo asigna a la variable entera total durante su inicialización. El valor de la variable luego de la operación es 13
* El operador de asignación evalúa la operación relacional y obtiene el valor falso que luego almacena en la variable número_mayor.
* El operador de asignación evalúa la operación lógica y obtiene el valor verdadero que luego almacena en la variable resultado_conjunción.

### Uso de variables en las expresiones

Todos los operadores pueden recibir variables como parámetros siempre que sean del tipo adecuado, no solamente valores constantes como lo hemos hecho hasta ahora. De esta forma podemos almacenar valores en variables, realizar operaciones sobre ellos y almacenar los resultados en otras variables. Los siguientes son algunos ejemplos de este tipo de uso de los operadores.
* Esta operación calcula el área de un cuadrado a partir de la longitud de sus lados, almacenada en la variable longitud_del_lado, y la almacena en la variable área_cuadrado.
* Esta operación toma los valores de las variables precio y cantidad, calcula la operación correspondiente (una multiplicación en este caso) y almacena el resultado en la variable total.
* Esta operación estima la cantidad de semanas transcurridas tomando la cantidad de días transcurridos y dividiéndola entre 7. semanas_transcurridas es una variable real para almacenar el resultado con decimales. Se usa 7.0 como divisor para garantizar que el resultado de la expresión sea un número real, no entero, y evitar un error al compilar o ejecutar el programa.

### Expresiones complejas y precedencia de operadores

Al igual que en las operaciones usadas en la aritmética, en los lenguajes de programación las operaciones simples que hemos visto hasta el momento se pueden combinar en operaciones más complejas y estas se evalúan realizando las operaciones en un orden preestablecido. Este orden es especificado por la precedencia de los operadores. Los operadores con mayor precedencia se evalúan antes que los operadores con menor precedencia. Cuando el compilador encuentra una expresión con dos operadores que tiene el mismo nivel de precedencia, los evalúa de izquierda a derecha. En el siguiente ejemplo se efectúa primero la multiplicación y luego la suma, porque ese operador tiene precedencia.
Al igual que en las matemáticas básicas, es posible alterar el orden de evaluación usando paréntesis para agrupar y acomodar expresiones. En la siguiente expresión se usan los paréntesis para realizar primero la suma que modifica el precio actual y luego calcular el costo total usando la multiplicación:
La siguiente tabla muestra la precedencia que tienen los operadores que hemos visto en esta lección en la mayoría de los lenguajes de programación. La precedencia se muestra de forma decreciente por lo tanto los operadores con la menor precedencia en esta tabla se evalúan primero. Los operadores que tienen la misma precedencia se evalúan de izquierda a derecha.
| Precedencia | Operador | Descripción |
| 1 | ( ) | Paréntesis |
| 2 | - | Negación aritmética |
| 3 | ^ | Exponenciación |
| 4 | * / % | Multiplicación, división y módulo |
| 5 | + - | Suma y resta |
| 6 | > < >= <= = <> | Todos los operadores relacionales |
| 7 | no | Negación lógica |
| 8 | y o | Conjunción y disyunción |
Estos son algunos ejemplos de expresiones complejas con una explicación de la transformación que realizan.
| Expresión | Descripción |
| área_triángulo := longitud_base * longitud_altura / 2.0 | Calcula el área de un triángulo. |
| interés_obtenido := capital * tasa_de_interés * tiempo / 100 | Calcula el interés simple de una inversión. |
| aceleración = (velocidad_final - velocidad_inicial) / tiempo | Calcula la aceleración de un cuerpo. |
| temperatura > 15 y temperatura < 30 | Operación lógica que regresa verdadero si la temperatura del día es agradable. |
| permitir_préstamo := no (libros_prestados >= 5 y profesor = falso) | Determina si un usuario de una biblioteca cumple con los requisitos para solicitar un libro prestado. |
| permitir_préstamo := libros_prestados < 5 o profesor = verdadero) | Una forma alternativa de expresar la verificación del ejemplo anterior. |

## Resumen de la lección

* Las expresiones son combinaciones de constantes, variables y operadores de diferentes tipos que nos permiten manipular datos para obtener información nueva.
* Los operadores aritméticos realizan operaciones equivalentes a las operaciones aritméticas básicas.
* Los operadores relacionales permiten realizar comparaciones entre valores.
* Los operadores lógicos implementan las principales conectivas de la lógica proposicional.
* El operador de asignación almacena los resultados de las expresiones en variables.
* Las variables se pueden usar como operandos en las expresiones.
* Las expresiones se pueden combinar para formar expresiones complejas de la misma forma en que se combinan en la aritmética.
* La precedencia de los operadores determina el orden en que se evalúan las expresiones complejas.

## Términos clave

* Expresión
* Desigualdad matemática
* Expresión aritmética
* Lógica proposicional
* Paréntesis

## Lecturas adicionales

* Orden de operaciones

## Bibliografía

* ↑ Esta plantilla puede crear una infobox en la mayoría de los escenarios que se pueda necesitar. También puede ser usada como plantilla para crear infoboxes más personalizadas. Por ejemplo, crea la página Plantilla:Loquesea y luego añade esta plantilla con cualquier elemento que quieras. Por ejemplo, |lbl1=Continente:|row1={{{continente|}}}, sería llamado con algo como {{Loquesea|continente=Africa}} y mostrar una fila 'Continente: Africa'. Parámetros {{Infobox | style0 = | color = | name = | sub0 = | img1 = | width1 = | cap1 = | hdr1 = | style1 = | lbl1 = | row1 = | sub1 = | style2 = | lbl2 = | row2 = | sub2 = ... etc. | hdr2 = | style21 = | lbl21 = | row21 = | sub21 = | style22 = | lbl22 = | row22 = | sub22 = ... etc. | hdr3 = | style31 = | lbl31 = | row31 = | sub31 = | style32 = | lbl32 = | row32 = | sub32 = ... etc. | img2 = | width2 = | cap2 = }} Los siguientes parámetros son reconocidos; style0 Estilo a aplicar a toda la tabla. El estilo predeterminado es style="position:relative; margin: 0 0 0.5em 1em; border-collapse: collapse; float:right; clear:right; width:200px;" border="1" cellpadding="0" color El color de fondo de los títulos. El color predeterminado es el blanco. name Texto a mostrarse en la parte superior de la infobox. No hay texto predeterminado. (No se muestra) sub# Un subtitulo a mostrar. sub0 se muestra bajo 'name', los otros bajo la fila 'row#' correspondiente. No hay texto predeterminado (no se muestra) img# Imagen(es) a mostrar. img1 se muestra arriba, img2 se muestra abajo. No hay imagen predeterminada. width# Ancho de la imagen (img#) correspondiente, el predeterminado es 250px cap# texto a mostrar bajo la imagen (img#) correspondiente. No hay texto predeterminado. hdr# Texto a mostrar al inicio de una sub-sección opcional. No hay texto predeterminado. row# texto a mostrar en una fila opcional. Las filas 1 a la 9 (row[1-9]) estan bajo hdr1, las filas 21 a la 29 (row[21-29]) bajo hdr2, etc. No hay texto predeterminado. lbl# Etiqueta opcional para datos almacenados en la fila (row #) correspondiente. No hay texto predeterminado. style# Estilo a aplicar a la fila (row#) correspondiente. No hay estilo predeterminado para este parámetros. Plantilla:Limpiar Example 1 Rana arborícola verde Estado de conservación: Preocupacion menor Rana arborícola verde (Litoria caerulea) Clasificación científica Reino: Animalia Filum: Chordata Clase Amphibia Orden: Anura Familia: Hylidae Género: Litoria Especie: L. caerulea Nombre binomial Litoria caerulea (White, 1790) {{Infobox | color = pink | name = [[w:Litoria caerulea|Rana arborícola verde]] | sub0 = <small>'''[[w:Estado de conservación|Estado de conservación:]] Preocupacion menor'''<ref name="iucn">{{IUCN2006|assessors=Hero ''et al''|year=2004|id=41082|title=Litoria caerulea|downloaded=11 May 2006}} Database entry includes a range map and justification for why this species is of least concern </ref></small> | | img1 = Magnificent tree frog (Litoria splendida) crop.jpg | width1 = 220px | cap1 = Rana arborícola verde (''Litoria caerulea'') | | hdr1 = [[w:Clasificacion científica|Clasificación científica]] | lbl1 = [[w:Reino_(biología)|Reino]]: | row1 = [[w:Animal|Animalia]] | lbl2 = [[w:Filo|Filum]]: | row2 = [[w:Chordate|Chordata]] | lbl3 = [[w:Clase_(biología)|Clase]] | row3 = [[w:Amphibia|Amphibia]] | lbl4 = [[w:Orden_(biología)|Orden]]: | row4 = [[w:Anura|Anura]] | lbl5 = [[w:Familia_(biología)|Familia]]: | row5 = [[w:Hyliade|Hylidae]] | lbl6 = [[w:Género_(biología)|Género]]: | row6 = ''[[w:Litoria|Litoria]]'' | lbl7 = [[w:Especie|Especie]]: | row7 = '''''L. caerulea''''' | | hdr2 = [[w:esNombre_binomial|Nombre binomial]] | style21 = style="text-align:center;" | row21 = '''''Litoria caerulea''''' | sub21 = (White, 1790) }} Plantilla:Limpiar Texto en cursiva
* 1 2 3 4 5 6 7 Joyanes Aguilar, Luis (2013). Fundamentos generales de programación (1.ª edición). Ciudad de México, México: McGraw Hill. p. 368. ISBN 978-607-15-0818-8.
* 1 2 Helo Guzmán, Jose E. (2000). Introducción a la programación con Scheme (en español eliel) (1.ª edición). Cartago, Costa Rica: Editorial Tecnológica de Costa Rica. p. 246. ISBN 9977-66-113-8.
* Proyecto: Fundamentos de programación
* Anterior: Evaluación de la lección 5 — Expresiones — Siguiente: Evaluación de la lección 6