Fundamentos de programación/Expresiones

De Wikiversidad
Ir a la navegación Ir a la búsqueda
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.[1]

Operadores aritméticos[editar]

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:[1]

  • 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.

Esta es una lista de los operadores 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.
- Negación 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[editar]

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.[1] 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.[2]

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 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.[1] 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.[1]

Operadores lógicos[editar]

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.[2] 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[editar]

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
entero total := 5 + 8
  • 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.
número_mayor := 7 >= 15
  • 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.
resultado_conjunción := verdadero y verdadero

Uso de variables en las expresiones[editar]

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.
área_cuadrado := longitud_del_lado * 4
  • 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.
total := precio * cantidad
  • 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.
real semanas_transcurridas := días_transcurridos / 7.0

Expresiones complejas y precedencia de operadores[editar]

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 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.[1] En el siguiente ejemplo se efectúa primero la multiplicación y luego la suma, porque ese operador tiene precedencia.

total := costo_por_servicio + precio_producto * cantidad_adquirida

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.[1] 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:

costo_total := ( precio_actual + aumento_del_costo ) * cantidad_adquirida

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[editar]

  • 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[editar]

Lecturas adicionales[editar]

Bibliografía[editar]

  1. 1,0 1,1 1,2 1,3 1,4 1,5 1,6 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. 
  2. 2,0 2,1 Helo Guzmán, Jose E. (2000). Introducción a la programación con Scheme (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