Índice del capítulo. Capítulo 4. Expresiones. Las expresiones. Indice de la sección. Lenguajes de Programación. Introducción. 2.

Documentos relacionados
Lenguajes de Programación. Capítulo 4. Expresiones.

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Principios de Computadoras II

Expresiones y sentencias

Datos Elementales y formato de un programa en Java

El lenguaje C. 1. Identificadores, constantes y variables

4. Operadores Operador asignación

Lenguajes de Programación. Capítulo 3. Variables.

Arreglos y Subrangos

Java posee dos grandes categorías de tipos para las variables:

Lenguajes de Programación Capítulo 2. Valores y Tipos

DESCRIPCIÓN DEL LENGUAJE DE PROGRAMACIÓN P-0

Expresiones y sentencias

Tema 2. El lenguaje JAVA

CAPÍTULO IV: 4.1 Introducción a la. Programación Funcional

Datos y tipos de datos

Arreglos y Subrangos

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

3.3 Conceptos Básicos del Lenguaje Java

Tema II: Introducción al Lenguaje Funcional

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

2.2 Nombres, Ligado y Ámbito

Curso de Java Introducción a la Programación II

Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota:

INICIACIÓN A LA PROGRAMACIÓN II

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Estructura de Datos Unidad 1: Repaso del Lenguaje Java

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

Comprender las diferencias entre tipos de datos primitivos similares, y aprender a elegir el tipo más conveniente en cada caso.

El operador contenido ( ) permite acceder al contenido de

Tema 4. Operadores y Expresiones

TEMA 02 TIPOS, OPERADORES Y EXPRESIONES

Tema 3. Tipos de datos simples

Lenguajes de Programación I

TEMA 3. OPERADORES Y EXPRESIONES.

Tema 2: Desarrollo de Algoritmos. E.E. de Algorítmica

21/03/2018. Variables y Constantes. Los datos de un programa están representados por variables o constantes y tienen asociado un tipo.

Los tipos de datos primitivos

Lenguajes de Programación I

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

Tema 3. Patrones y Definiciones de Funciones

Tema 2. Tipos predefinidos

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

Programación Tema 3: Tipos y expresiones simples. Programación DIT-UPM

Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado.

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

Prof. María Alejandra Quintero. Informática Año

Tema 3. Patrones y Definiciones de Funciones

Análisis semántico: Comprobación de tipos

Compiladores: Análisis Semántico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inès Alvarez V.

Laboratorio de Lenguajes de Programación Introducción al lenguaje ML

Fundamentos de Informática 5. Operadores, expresiones (y su aplicación)

Los parámetros: son los campos que se comunican a los métodos de los objetos.

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

Prefacio 25 Organización de la Unidad Didáctica Cómo utilizar el libro Objetivos docentes... 27

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Tema 2: EL TIPO DE DATOS ENTERO. INSTRUCCIÓN DE ASIGNACIÓN Y DE COMPOSICIÓN SECUENCIAL

Introducción a Haskell. El lenguaje Haskell

Curso Informática Lección 3. Tipos de datos, constantes y variables

Procesadores de lenguaje Tema 5 Comprobación de tipos

Unidad II: Análisis semántico

Tutorial Haskell David Julián Guzmán Cárdenas Cristian Alexanther Rojas Cárdenas Luis Ernesto Gil Castellanos

Nombres, Ligaduras, Chequeo de Tipos y Alcance. Luis Garreta (Basados en el libro de Robert Sebesta)

INTRODUCCIÓN A LA PROGRAMACIÓN EN FORTRAN. Métodos Numéricos Carlos Zotelo

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

Una lista de operadores que pueden o no sobrecargarse es la siguiente: Operadores que pueden sobrecargarse

Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas

Operadores aritméticos. / División operando enteros o reales si operandos son entero resultado es entero. Resto de caso resultado real

Programación en Lenguaje C

Elementos léxicos del lenguaje de programación Java

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Introducción a Haskell. Cecilia Manzino

Informática PRÀCTICA 3 Curs Práctica Nº 3: Tipos de datos simples. Constantes y variables. Operadores aritméticos. Formato de salida.

UNIDAD 2 Descripción de un programa

Expresiones Lógicas y Operadores sobre Bits

Lección 2 Introducción al lenguaje C

VARIABLES TIPOS FUNDAMENTALES

Programación. Tema 3: Tipos de Datos Primitivos Martes Martes Jueves Capítulo 1 Libro de Java

Curso de Programación Avanzada en C

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Tipos primitivos, referencias y expresiones

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Informática Ingeniería en Electrónica y Automática Industrial

Java para programadores

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

Dra. Jessica Andrea Carballido

14/03/2018. Problemas, Algoritmos y Programas. Problemas, Algoritmos y Programas. Programas y Lenguajes. Programas y Lenguajes. Programas y Lenguajes

PHP: Lenguaje de programación

Tipos de Datos Simples Contenido del Tema

Java. Introducción a la Programación Orientada a Objetos

ESTRUCTURA DE LOS LENGUAJES DE PROGRAMACIÓN

Estructura de datos Tema 2: Tipos Abstractos de Datos (TADs)

Introducción a la Programación

Laboratorio de Arquitectura de Redes. Operadores y expresiones en lenguaje C

Introducción a la computación. Primer Cuatrimestre de 2013

Transcripción:

Índice del capítulo Capítulo 4. Expresiones Lenguajes de Programación Capítulo 4. Expresiones 1. Carlos Ureña Almagro 2. Dpt. Lenguajes y Sistemas Informáticos ETSI Informática y de Telecomunicación Universidad de Granada Curso 2010-11 3. 4. LLamadas a funciones 5. Expresiones condicionales Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 1/1. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 2/1. 6. Indice de la sección Sección 1 Las expresiones Las expresiones son otro de los conceptos básicos que surgen en los primeros lenguajes de programación (p.ej. Fortran) El objetivo principal es poder expresar con facilidad cálculos complejos, con una sintaxis inspirada en las matemáticas. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 3/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 4/76.

Ejemplo de un cálculo Sin expresiones (usando solo variables y registros) r1 = [velocidad] r2 = [tiempo] r1 *= r2 r2 = [posini] r1 += r2 [posact] = r1 Con expresiones: El concepto de expresión Una expresión es un trozo del texto de un programa que denota un proceso de cálculo que produce como resultado un valor.. El cálculo será llevado a cabo durante la ejecución del programa. El proceso de llevar a cabo este cálculo se denomina evaluar la expresión Una expresión se puede evaluar un número arbitrario de veces durante la ejecución de un programa. Cada vez puede producir un valor distinto como resultado. posact = posini + ( velocidad * tiempo ) ; Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 5/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 6/76. El concepto de expresión. Tipo. Es deseable que el tipo del valor producido sea el mismo todas las veces que el cálculo se lleve a cabo durante la ejecución del programa (facilita la legibilidad y la fiabilidad). En esos casos, llamamos tipo de la expresión al tipo del valor producido. El concepto de expresión. Tipo. En los lenguajes en consideración (C/C++, Ada, Java, C#, python), toda expresión de un programa tiene un tipo. En algunos lenguajes interpretados (Php, p.ej.), cada evaluación de una expresión puede producir un valor de un tipo distinto. Las expresiones no tienen tipo. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 7/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 8/76.

Ejemplo de expresiones sin tipo en PHP Java: 1 f l o a t x = 2 3+4 ; 2 // 2 3+4 e s una e x p r e s i o n de t i p o e n t e r o php: 1 $x =... ; 2 i f ( $x > 0 ) 3 $v = 45 ; 4 e l s e 5 $v = h o l a ; 6 echo $v ; // $v es una e x p r e s i o n de 7 // t i p o e n t e r o o cadena El concepto formal de expresión. Formalmente, una expresión es una aplicación que asigna un valor a cada estado de ejecución posible. Un estado de ejecución es un conjunto finito de variables distintas, cada una con al menos un nombre, un tipo, y un valor del tipo. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 9/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 10/76. El concepto de expresión: estados de ejecución Un ejemplo de un estado de ejecución es el siguiente conjunto de dos variables (cada una es una tupla). { ( "x", integer, 1 ), ( "peso", float, 67.8 ) } En principio, los nombres de dos variables de un estado de ejecución no pueden coincidir El concepto formal de expresión. Si e denota una expresión de tipo T y S un estado de ejecución, entonces e(s) es un valor de tipo T que coincide con el resultado de evaluar e en el estado de ejecución S. Normalmente, escribiremos dicho valor usando una función llamada eval, que asigna un valor a cada expresión y estado de ejecución posible: e(s) = eval(e, S) Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 11/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 12/76.

Fallos en la evaluación: No todas las expresiones pueden evaluarse en todos los estados de ejecución posibles. Formalmente: el dominio de cada expresión posible (vista como una aplicación) será un subconjunto de todos los estados de ejecución posibles. Fallos en la evaluación. Ejemplos. Supongamos que 4*x+2 es una expresión de tipo entero. En estas condiciones, el dominio de la expresión son todos los estados de ejecución que contienen al menos una variable de nombre x y de tipo entero. El dominio de la expresión entera 5+8/x será un subconjunto del dominio de 4*x+2, en concreto, solo contendrá estados de ejecución en los cuales la variable de nombre x no contenga el valor 0. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 13/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 14/76. Fallos en la evaluación. Decimos que la evaluación de una expresión falla cuando tiene lugar en un estado de ejecución que no pertenece a su dominio. Si la evaluación de e falla en el estado S, entonces escribiremos que: eval(e, S) = error. Aquí, error se considera un valor especial del tipo. Durante una ejecución programa, el valor resultado de la evaluación es indeterminado, y dicha ejecución debería abortar, o bien se debería de producir una excepción. Categorías de expresiones. En el resto de este capítulo examinaremos las distintas categorías de expresiones que pueden aparecer en los lenguajes de programación. No existen diferencias importantes en las categorías de las expresiones, ni en la sintaxis de las mismas, entre los lenguajes Algol, Pascal, C/C++, Ada, Java y C# Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 15/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 16/76.

Indice de la sección tipos primitivos de tipos primitivos Sección 2 2.1. tipos primitivos 2.2. de tipos compuestos (agregados) Un literal es una expresión que denota directamente un valor de un tipo El resultado de evaluar un literal es siempre el valor que denota. No depende del estado de ejecución. En cualquier lenguaje, este tipo de expresiones si tiene un tipo. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 17/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 18/76. tipos primitivos de tipos primitivos tipos primitivos Tipo lógico En la práctica, la evaluación de un literal no conlleva cálculo alguno. La evaluación de un literal no puede fallar, ya que puede hacerse en cualquier estado de ejecución. Los literales de tipos primitivos son las expresiones más sencillas posibles. En la inmensa mayoría de los lenguajes que incorporan el tipo lógico ( {true, false} ), existen dos literales que denotan los dos valores del tipo: true que denota el valor true false que denota el valor false Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 19/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 20/76.

tipos primitivos Caracteres tipos primitivos Enumerados Normalmente, estos literales se escriben especificando el carácter que denotan entre comillas simples. Por ejemplo, el carácter con código ASCII 48 (el dígito 0), se denota con 0 Todos los lenguajes incorporan la posibilidad de escribir uno de estos literales usando el código ASCII o Unicode del carácter en cuestión. (p.e.j. \60 o \x30 en C/C++, o \060 o \u0030 en Java denotan todos el carácter 0 ). En la definición de un tipo enumerado, el programador proporciona un identificador para cada valor distinto del tipo. Este identificador se considera como un literal del tipo enumerado Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 21/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 22/76. tipos primitivos Enteros tipos primitivos Enteros. Resolución de ambigüedad en el tipo. Estos literales se escriben normalmente como secuencias de dígitos consecutivos, que coinciden con la expresión en base 10 del valor que denotan Suelen existir mecanismos para expresar los valores en base 8 o en base 16 En Ada, se puede escribir 7 654 321 en lugar de 7654321 (mejora la legibilidad) A los literales formados por secuencias de dígitos se les puede asignar más de un tipo entero, ya que los intervalos de enteros incluidos en cada tipo no son disjuntos. Por ejemplo, la expresión 34 puede ser, en C/C++ de cualquiera de los tipos enteros (char, short, int, long,...) Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 23/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 24/76.

tipos primitivos Enteros. Resolución de ambigüedad en el tipo. de tipos compuestos (agregados) de tipos compuestos (agregados) En algunos lenguajes (C/C++, Java,C#): Se le asocia el tipo que menos bits ocupe (menor rango de valores) y que contenga al valor entero denotado por el literal. Se pueden forzar otras interpretaciones (p.ej., en C/C++ 34L es de tipo long) En otros lenguajes (Ada), se usa el tipo que se espera según el contexto donde aparece la expresión Son expresiones que denotan directamente un valor (de un tipo compuesto o recursivo), y que siempre se evalúan a dicho valor. Básicamente pueden existir agregados de tipo registro y de tipo array, aunque los lenguajes funcionales suelen contemplar de tipos recursivos (listas y árboles). En C/C++ y Java solo se permiten en inicializaciones de variables, en Ada y C# en cualquier lugar Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 25/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 26/76. de tipos compuestos (agregados) Agregados en inicializaciones en C/C++ 1 main ( ) 2 { 3 i n t c [ 3 ] = { 34, 56, 78 } ; 4 s t r u c t { i n t i, char c } s = { 12, A } ; 5..... 6 } de tipos compuestos (agregados) Uso erróneo de agregados en C/C++ Es un ejemplo ausencia de uniformidad en el lenguaje 1 main ( ) 2 { 3 i n t c [ 3 ] ; 4 s t r u c t { i n t i, char c } s ; 5 6 c = { 34, 56, 78 } ; // e r r o r! 7 s = { 12, A } ; // e r r o r! 8 } Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 27/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 28/76.

de tipos compuestos (agregados) Agregados en inicializaciones en Ada 1 procedure Agregados i s de tipos compuestos (agregados) Agregados en inicializaciones en Ada 1 procedure Agregados i s 2 3 type m a t r i z i s Array ( 1.. 3 ) of I n t e g e r ; 4 type r e g i s t r o i s record 5 i : I n t e g e r ; 6 c : C h a r a c t e r ; 7 end record ; 8 9 m : m a t r i z := ( 23, 45, 67 ) ; 10 r : r e g i s t r o := ( 12, A ) ; 2 3 type m a t r i z i s... ; 4 type r e g i s t r o i s.... ; 5 m : m a t r i z ; 6 r : r e g i s t r o ; 7 8 begin 9 10 m := ( 23, 45, 67 ) ; 11 12 begin 13.... 14 end Agregados ; 11 12 r := ( 12, A ) ; 13 14 end Agregados ; Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 29/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 30/76. de tipos compuestos (agregados) Agregados con etiquetas de tipos compuestos (agregados) Agregados en Java y C# En Ada, en los agregados se pueden especificar los nombres de los campos o los índices de los elementos 1 procedure Agregados i s 2... 3 begin 4 5 r := ( i => 12, c => A ) ; 6 r := ( c => A, i => 12 ) ; 7 8 m := ( 1 => 23, 3 => 45, 2 => 45 ) ; 9 m := ( 1 => 23, 2.. 3 => 45 ) ; 10 11 end Agregados ; Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 31/76. En Java y C# no existen agregados de tipo registro o clase, pero sí de tipo Array. Pueden aparecer en cualquier sitio: 1 // d e c l a r a c i o n e s con i n i c i a l i z a c i ó n : 2 i n t [ 5 ] m = { 1, 2, 3, 4, 5 } 3 i n t [ ] m = { 1, 2, 3, 4, 5 } ; 4 i n t [ ] m = new i n t [ ] { 1, 2, 3, 4, 5 } ; 5 6 // en a s i g n a c i o n e s : 7 m = new i n t [ ] { 1, 2, 3, 4, 5 } ; 8 9 // como parámetros : 10 fun ( new i n t [ ] {1,2,3,4,5} ) ; Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 32/76.

Indice de la sección Sección 3 3.1. Accesos a elementos de var. compuestas 3.2. 3.3. Expresiones de tipo referencia o puntero Accesos a variables Los accesos a variables son, en general, expresiones que dependen expĺıcitamente del estado de ejecución, es decir, de los valores de las variables existentes en el momento de la evaluación. Hay de varios tipos: Accesos simples Accesos a elementos de variables compuestas Combinaciones Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 33/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 34/76. Accesos simples La forma más simple de acceder a una variable es usar una expresión formada únicamente por el nombre de la variable: Si la variable no existe en el estado de ejecución actual, la evaluación falla. Los lenguajes como Ada, Pascal, C/C++, Java y C# comprueban esto en tiempo de compilación (ya que las var. tienen ámbito estático). Si la variable existe, el resultado de la evaluación es el valor actual de dicha variable. Accesos simples En los lenguajes donde las variables tienen un único tipo, el tipo de la expresión es el tipo de la variable nombrada Si en el lenguaje las variables no tienen asignado un único tipo, la expresión tampoco tiene tipo (poco recomendable, baja legibilidad). Es deseable evitar evaluaciones fallidas en tiempo de ejecución, así que muchos lenguajes comprueban en tiempo de compilación si la variable existe o no. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 35/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 36/76.

Expresiones de tipos-valor y tipos-referencia En los lenguajes con tipos-referencia y tipos-valor (Java, C#): Si una variable es de un tipo-valor, el nombre de la variable forma una expresión que se evalúa al valor de la variable Si una variable es de un tipo-referencia, el nombre de la variable forma una expresión que se evalúa como la localización de la variable en el heap que referencia (o NULL). Ejemplo de expresiones formadas por un nombre de variable (Java y C#) 1 i n t x = 34, // t i p o v a l o r (34 en e l s t a c k ) 2 y ; 3 4 i n t [ ] a = {1,2,3}, // t i p o r e f e r e n c i a 5 // ({1,2,3} s i t u a d o en e l heap ) 6 b ; 7 8 y = x ; // l a e x p r. x se e v a l ú a a 34 9 b = a ; // l a e x p r. a se e v a l ú a a l a l o c. de {1,2,3} Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 37/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 38/76. Accesos a elementos de var. compuestas Accesos a elementos de variables compuestas Accesos a elementos de var. compuestas Accesos a elementos de variables compuestas Cuando una variable es de un tipo compuesto (arrays y registros), podemos construir expresiones que se evalúan al valor actual de alguna de las variables que son componentes de dicha variable compuesta. Estas expresiones son semejantes a los accesos a variables simples en cuanto a su semántica. Si el elemento de la estructura tiene un tipo único, la expresión también lo tiene. En este caso las variables son anónimas, así que no podemos usar solamente un nombre. Para construir estas expresiones, debemos de indicar la variable compuesta y el elemento de la misma al que queremos acceder. Estas expresiones se pueden anidar, ya que a veces será necesario acceder a elementos de elementos de estructuras. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 39/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 40/76.

Accesos a elementos de var. compuestas Accesos a elementos de arrays Accesos a elementos de var. compuestas Accesos a elementos de arrays Sea: v una expresión de tipo A B (se evalúa como una referencia a un array almacenado en memoria, el array tiene índices de tipo A y elementos de tipo B) e una expresión de tipo A, S un estado de ejecución cualquiera Con esto podemos construir la expresión v(e) de tipo B, y se cumple que: eval(v(e), S) = f a (i) En la última igualdad: i = eval(e, S) A f a A B es la aplicación asociada al array a a = eval(v, S) A B, es el array que resulta de evaluar v Se produce fallo si: eval(e, S) / A : no se puede evaluar el índice, o produce un valor que no es del tipo (por ejemplo, está fuera de rango). eval(v, S) / A B : evaluar v no produce una referencia a un array del tipo correcto o falla. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 41/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 42/76. Accesos a elementos de var. compuestas Accesos a elementos de arrays en varios lenguajes Accesos a elementos de var. compuestas Accesos a elementos de registros o clases: Sean las siguientes expresiones: a I 1 T e 1 I 1 b (I 1 I 2 ) T e 2 I 2 Entonces las siguientes son expresiones de tipo T Son expresiones similares a los accesos a arrays, solo que en este caso el componente no se selecciona con una expresión, sino con un identificador del componente al que queremos acceder (el nombre del campo) El tipo de la expresión es el tipo del campo accedido. C/C++/Java a[e 1 ] b[e 1 ][e 2 ] Ada a(e 1 ) b(e 1,e 2 ) C# a[e 1 ] b[e 1 ][e 2 ] == b[e 1,e 2 ] Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 43/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 44/76.

Accesos a elementos de var. compuestas Accesos a elementos de registros o clases: Accesos a elementos de var. compuestas Accesos a elementos de registros o clases: Sea: e una expresión de tipo A 1 A 2...A n, en la cual ident i es el identificador o etiqueta del i-ésimo campo (el de tipo Ai) S un estado de ejecución cualquiera En estas condiciones, podemos escribir la expresión: e.ident i que es de tipo A i y se cumple que: En la última igualdad: (A 1 A n ) A i es la aplicación que selecciona el i-ésimo componente de una tupla C i r = eval(e, S) A 1 A n es el registro obtenido como resultado de evaluar e Si eval(e, S) = fallo, entonces eval(e.ident i, S) = fallo eval(e.ident i, S) = C i (r) Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 45/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 46/76. Accesos a elementos de var. compuestas Combinaciones de accesos a arrays y registros Se pueden combinar los accesos a elementos de arrays o registros que a su vez sean elementos de arrays o registros, a niveles arbitrarios. C++/Java/C#: r[3].a[4][5] a[6].c.d Ada r(3).a(4,5) a(6).c.d En general toda expresión de acceso a una variable de tipo T (de tipo simple o compuesto, elemento de otra variable o no) en lenguajes que incluyan el tipo referencia, puede evaluarse en dos contextos: En contextos donde se espera un valor de tipo T, la evaluación produce el valor de la variable En los contextos donde se espera una referencia a una variable de tipo T, la evaluación produce la identidad de la variable. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 47/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 48/76.

Puesto que una variable de tipo referencia contiene un valor que es la localización de otra variable, usaremos la primera para acceder a la segunda. Esta operación es la utilidad principal y más frecuente de las referencias, por tanto, los lenguajes incorporan mecanismos para hacer esto fácilmente. Supongamos (en un lenguaje que incluya expĺıcitamente las referencias como tipos) que r es una expresión de tipo ref (T ) (o bien de su subtipo ref(t ) ), entonces consideraremos la expresión: como una expresión de tipo T. Nótese que esta notación no pertenece a ningún lenguaje en concreto [r] Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 49/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 50/76. Accesos a través de punteros en C/C++: La evaluación de la expresión [r] en un estado S tiene lugar evaluando la expresión r, interpretándola como de tipo referencia: Si produce la referencia nula, hay un fallo Si produce la identidad de una variable v en S de tipo T, el resultado de evaluar la expresión es el valor de v en S (de tipo T ). Si p es una expresión de tipo puntero a T ( T * ), entonces, *p es una expresión de tipo T, (equivalente a [p]), y por tanto: eval( p, S) = eval([p], S) La evaluación de *p puede fallar (si la evaluación de p falla o produce NULL) Se puede producir un valor indeterminado (si el valor de p no es la identidad de una variable de tipo T, aunque esto pasaría desapercibido. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 51/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 52/76.

en C/C++: en Ada: Si r es una expresión de tipo referencia a T ( T & ), pero aparece en un contexto donde se espera una expresión de tipo T, entonces: eval(r, S) = eval([r], S) En estos casos r se considera como equivalente a [r], y por tanto como una expresión de tipo T. La evaluación de r como referencia puede fallar, pero si no lo hace produce la identidad de una variable de tipo T (nunca produce NULL). Si r es una expresión de tipo referencia a T (access T o access all T ), entonces r.all es una expresión de tipo T, y en este caso: eval(r.all, S) = eval([r], S) La evaluación de r.all puede fallar (si la evaluación de r falla o produce NULL) Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 53/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 54/76. Accesos con referencias a elementos de variables compuestas en Ada y C/C++ Existen ciertas abreviaturas (y ambigüedades en C/C++) cuando la variable accedida vía una referencia o puntero es componente de otra: C/C++ p[e] == (*p)[e] distinto de *(p[e]) == *p[e] p->id == (*p).id distinto de *(p.id) == *p.id Ada p.all(e) == p(e) p.all.id == p.id Accesos con referencias en Java y C# Si V es un tipo-valor, entonces no es posible acceder mediante referencias a las variables de tipo V (no existen las referencias a V ) Si R es un tipo-referencia, entonces no es posible escribir una expresión que se evalúe al valor de una variable de tipo R (solo se pueden escribir expresiones de tipo referencia). Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 55/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 56/76.

Accesos con referencias en Java y C# Expresiones de tipo referencia o puntero Expresiones de tipo referencia Si e es una expresión de tipo R (un tipo-referencia), entonces: Impĺıcitamente el tipo de la expresión es referencia a R, y por tanto: La evaluación de e produce, bien NULL (la referencia nula o vacía), bien una identidad de una variable de tipo R situada en el heap. En los lenguajes que contemplan expĺıcitamente los tipos referencia, es posible escribir una expresión que al evaluarse produzca como resultado una referencia a una variable. El resultado de evaluar esa expresión es una referencia que podrá ser usada posteriormente para acceder a la variable. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 57/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 58/76. Expresiones de tipo referencia o puntero Expresiones de tipo referencia LLamadas a funciones Indice de la sección Sea e una expresión cuya evaluación produzca el valor de una variable v de tipo T. En estas condiciones, las siguientes expresiones son de tipo ref(t ) Sección 4 LLamadas a funciones C/C++ &e == &(e) Ada e access En Java y C# estas expresiones no existen, pues no existe el tipo referencia de forma expĺıcita. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 59/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 60/76.

LLamadas a funciones LLamadas a funciones Sea ident el nombre un subprograma que devuelve un valor (una función) de tipo T, y acepta una serie de parámetros de tipos T 1, T 2,..., T n Sea e 1, e 2,..., e n una serie de n expresiones, con e i T i En estas condiciones, podemos construir la siguiente expresión de tipo T ident(e 1, e 2,..., e n ) LLamadas a funciones Llamadas a funciones Para evaluar ident(e 1, e 2,..., e n ) es necesario: Evaluar cada uno de las ei (expresiones llamadas parámetros actuales) si alguna evaluación falla, la evaluación de la expresión original falla. Inicializar los parámetros formales con los valores obtenidos al evaluar los parámetros actuales. Ejecutar la función. Si se produce algún fallo al ejecutar la función, la evaluación falla. El resultado de evaluar la expresión es el valor devuelto por la función. En algunos lenguajes, en lugar de un nombre de función se puede usar también una expresión que se evalua a una referencia a un subprograma. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 61/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 62/76. Expresiones condicionales Indice de la sección Sección 5 Expresiones condicionales Expresiones condicionales Expresiones condicionales. Sean: b una expresión de tipo lógico e1 y e2 dos expresiones distintas de un mismo tipo T. En estas condiciones podemos escribir la siguiente expresión de tipo T if b then e 1 else e 2 Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 63/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 64/76.

Expresiones condicionales Sea: Entonces: x = eval( if b then e 1 else e 2, S) x = { eval(e1, S) si eval(b, S) = true eval(e 2, S) si eval(b, S) = false Expresiones condicionales Expresiones condicionales en C/C++ En el lenguaje C/C++ si e 1 y e 2 son dos expresiones del un mismo tipo T (T es uno de los tipos enteros, enumerados, caracteres, o flotantes), y b es una expresión entera o lógica, entonces podemos escribir la expresión: La evaluación falla si falla la evaluación las expresiones b, e 1 o e 2 b? e 1 : e 2 Esta expresión tiene tipo T. Si b no de tipo bool sino algún tipo entero, entonces el valor 0 se equipara a false y cualquier otro valor se equipara a true. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 65/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 66/76. Indice de la sección Sección 6 : infijos (binarios) Un operador binario infijo op es un símbolo (o un identificador) que denota una aplicación f op (A B) C, y que permite escribir la siguiente expresión de tipo C e 1 op e 2 Donde e 1 y e 2 son dos expresiones, con e 1 A y e 2 B Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 67/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 68/76.

Operadores infijos (binarios) Se cumple que: eval(e 1 op e 2, S) = f op (eval(e 1, S), eval(e 2, S)) La evaluación de esta expresión fallará si falla la evaluación de alguno de los operandos, o la evaluación de la función f op Operadores prefijos (unarios) Un operador unario prefijo op es un símbolo (o un identificador) que denota una aplicación f op A B, y que permite escribir la siguiente expresión de tipo B op e Donde e es una expresión de tipo A. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 69/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 70/76. Operadores prefijos (unarios) Se cumple que: eval(op e, S) = f op (eval(e, S)) La evaluación de esta expresión fallará si falla la evaluación del operando, o la evaluación de la función f op Expresiones entre paréntesis En general, si e es una expresión de tipo T, entonces también lo será la expresión (e) Los paréntesis se suelen usar para resolver ambigüedades en las expresiones complejas con varios operadores binarios infijos o unarios prefijos Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 71/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 72/76.

Ambigüedades relaccionadas con operadores e 1 op 1 e 2 op 2 e 3 puede interpretarse de dos formas: (e 1 op 1 e 2 ) op 2 e 3 e 1 op 1 (e 2 op 2 e 3 ) op 1 e 1 op 2 e 3 puede interpretarse de dos formas: (op 1 e 1 ) op 2 e 2 op 1 (e 2 op 2 e 3 ) Prioridad de los operadores Los operadores suelen tener asociado un valor numérico (llamado su prioridad), Esta prioridad sirve también para resolver las ambiguedades citadas en la transparencia anterior Sean op 1 y op 2 dos operadores binarios con op 1 mayor prioridad que op 2. Entonces podemos escribir las expresiones: e 1 op 1 e 2 op 2 e 3 = (e 1 op 1 e 2 ) op 2 e 3 e 1 op 2 e 2 op 1 e 3 = e 1 op 2 (e 2 op1 e 3 ) Si op 1 y op 2 tienen la misma prioridad, entonces (usualmente) se usa asociatividad a izquierdas para resolver la ambigüedad que aparece, es decir: e 1 op 1 e 2 op 2 e 3 = (e 1 op 1 e 2 ) op 2 e 3 Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 73/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 74/76. Prioridad de operadores Sean op 1 un operador unario y op 2 un operador binario. En estos casos, la prioridad tambien resuelve la ambigüedad que se presenta en la expresión op 1 e 1 op 2 e 2 fin del capítulo. Si op 1 tiene mayor prioridad que op 2, la interpretación es: (op 1 e 1 ) op 2 e 2 Si op 1 tiene menor prioridad que op 2, la interpretación es: op 1 (e 1 op 2 e 2 ) Si las prioridades coinciden, se usa asociatividad a izquierdas, es decir, la interpretación es: (op 1 e 1 ) op 2 e 2 Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 75/76. Autor: Carlos Ureña. Fecha creación: October 7, 2010. Página: 76/76.