jueves, 12 de abril de 2012

TIPOS Y EVALUACION DE EXPRESIONES

·         EXPRESIONES LOGICAS

           El resultado de la evaluación de la expresión es un valor lógico (cierto o falso). Se construye mediante operadores relacionales y operadores lógicos.



Operadores lógicos

             Operan sobre operandos (constantes, variables, expresiones) de diferentes tipos (numéricos, caracteres) y dan como resultado un valor de tipo lógico (cierto o falso; 1 o 0).



Operacion Operador Alg. Op. C Exp. C

Igualdad = == a==b

Desigualdad ≠ != a!=b

Menor < < a<b

Menor Igual ≤ab

Mayor ab

Mayor Igual ≥ab


Operador Lógico

 Operan sobre operandos (constantes, variables, expresiones) de tipo lógico (cierto o falso) y evalúan a un valor de tipo lógico (cierto o falso).

Operación Op. Algebraico Op. C Exp.

C y lógico && a && b

o lógico || a || b

Negación ¬ ! !a




Expresiones Lógicas

Ejemplos

!(p && q) || s

p && q && s

(a || b) && (c || d)

a > 5 && !(b < c) || 3 <= d

(op < min) || (op > max)

(edad >= 18) && (edad <= 60)



Precedencia de los Operadores Lógicos


( ) Sub-expresiones encerradas entre paréntesis se evalúan primero (mayor nivel de precedencia).

!&&|| (menor nivel de precedencia)




·         EXPRESIONES ARITMETICAS

  Los operandos que intervienen en ella son numéricos, el resultado es numérico y los operadores son aritméticos.



La Operación Asignación



variable = expresión;



La sentencia de asignación es un modo de darle valores a una variable.

La expresión se evalúa y el resultado es asignado a la variable.

La sentencia de asignación modifica el contenido de una variable.



variable = valor constante; x = 3;

variable = variable; x = y;

variable = expresión; x = (y + 1)/2;



Ejemplos

a = b;

suma = 60;

¿ Cuál será el valor que tomará la variable D tras la  ejecución de las siguientes instrucciones ?

A = 12;

B = A + 5;

C = B - 2;

D = C + (A + B);


Operadores Aritméticos

Decremento (--)

Para n = 5, la ejecución de la sentencia

i = n--; // post-decremento

asigna el valor 5 a i y después decrementa el valor de n a 4.

i = 5

n = 4

La ejecución de la sentencia

i = --n; // pre-decremento

decrementa el valor de n a 3 y después asigna este valor a i.

n = 3

i = 3


Operador Incremento/ decremento

• Siempre que pueda, no utilice ++a; o --a; aunque son operaciones válidas.

• Puede utilizar incrementos/ decrementos en una expresión, por ejemplo

x =5 +y++;

Equivalente a

x =5 +y;

y++;

• Se utilizan sólo con variables enteras.



Los operadores +, -, *, /, se pueden usar con operandos (constante, variable o expresión) tanto enteros como reales.

La división de enteros da como resultado un entero.

17/5 = 3

El operador módulo (%) sólo puede ser utilizado con operandos enteros. La expresión a%b da como resultado el resto de la división entera de dos números

a y b.

17%5 = 2


Los operandos de una expresión aritmética deben satisfacer las siguientes reglas:

1. Si ambos operandos son de tipo entero entonces el resultado es de tipo entero.

2.  Si uno de los operandos o ambos operandos son de tipo real entonces el resultado es de tipo real.

3. Si la expresión evaluada da como resultado un valor de tipo entero y la variable a la cual se le va a asignar este valor es de tipo real, entonces el resultado será convertido automáticamente al tipo real antes de realizar la asignación.

4. Si la expresión evaluada da como resultado un valor de tipo real y la variable a la cual se le va a asignar este valor es de tipo entero, entonces el resultado será convertido automáticamente al tipo entero antes de realizar la asignación.

5.  En general los tipos de datos son promovidos, desde un tipo mas angosto hacia uno más amplio. Ej: de int a float.

6. Cuando hay conversiones de datos más grandes a datos más pequeños, ocurre un truncamiento de los bits mas significativos.



·         EXPRESIONES  RELACIONALES

Los operadores relacionales, también denominados operadores binarios lógicos y de comparación, se utilizan para comprobar la veracidad o falsedad de determinadas propuestas de relación (en realidad se trata respuestas a preguntas). Las expresiones que los contienen se denominan expresiones relacionales. Aceptan diversos tipos de argumentos, y el resultado, que es la respuesta a la pregunta, es siempre del tipo cierto/falso, es decir, producen un resultado booleano.

Si la propuesta es cierta, el resultado es true (un valor distinto de cero), si es falsa false (cero). C++ dispone de los siguientes:


<      Menor que

>      Mayor que

<=    Menor o igual que

>=    Mayor o igual que

==    Igual que  (identidad)

!=     Desigual que (desigualdad)



expresión-relacional  <   shift-expresion

expresión-relacional  >   shift-expresion

expresión-relacional  <=  shift-expresion

expresión-relacional  >=  shift-expresion

expresión-de-igualdad == expresión-relacional

expresión-de-igualdad != expresión-relacional



Todos ellos son operadores binarios (utilizan dos operandos), de los cuales, dos de ellos son de igualdad: == y !=, y sirven para verificar la igualdad o desigualdad entre valores aritméticos o punteros.  Estos dos operadores pueden comparar ciertos tipos de punteros, mientras que el resto de los operadores relacionales no pueden utilizarse con ellos.


Observe que los operadores == y != tienen una menor precedencia  que el resto de los operadores relacionales < y >, <= y >=.

El operador de desigualdad != tiene otra forma estándar de designación mediante la palabra clave not_eq

          Cualquiera que sea el tipo de los operandos, por definición, un operador relacional, produce un bool (true o false) como resultado, aunque en determinadas circunstancias puede producirse una conversión automática de tipo a valores int (1 si la expresión es cierta y 0 si es falsa).


Ejemplo de comprobación:


#include <iostream.h>

 int main() {

   float f = 12.1, g = 12.2;

   cout << "Tipo: " << typeid(f < g).name() << endl;

 }


Salida


Tipo: bool


En las expresiones relacionales E1 <operador> E2, los operandos deben cumplir alguna de las condiciones siguientes:

1.E1 y E2 son tipos aritméticos.

2.E1 y E2 son punteros a versiones cualificadas o no cualificadas de tipos compatibles.

3.Uno de ellos es un puntero a un objeto, mientras que el otro es un puntero a una versión cualificada o no cualificada de void.

4.Uno de los dos es un puntero, mientras que el otro es un puntero nulo constante.


Cuando se trata de tipos definidos por el usuario (que no cumplen las condiciones anteriores) estos operadores pueden ser sobrecargados de forma que puedan ser utilizados con dichos tipos.  


 Las expresiones relacionales evalúan mediante un operador si las expresiones que se encuentra al lado izquierdo y derecho del mismo cumplen con lo expresado por el operador, a esto también se le conoce como criterio de selección.


Expresión o valor 1 debe ser del mismo tipo de la expresión o valor dos, esto no significa que en ambos lados de la expresión deben existir valores equiparables es decir yo no puedo comparar el color azul con veinte unidades de azúcar, más adelante conoceremos otros tipos de datos diferentes a los numéricos y por tanto se hace esta precisión ahora.

Método para evaluar expresiones relacionales.

 Para obtener el resultado de False o True, es necesario lograr equipara el lado izquierdo y derecho de la expresión relacional, para tales efectos lo ideal es dejar un solo término tanto al lado derecho como al lado izquierdo de la expresión y realizar la comparación entre estos dos únicos términos.

 1. Identificar el lado derecho, el operador relacional y el lado izquierdo de la expresión. Para esto nos valemos del hecho, que una expresión relacional solo puede tener un operador relacional.

 2. Resolver la expresión del lado  izquierdo del operador relacional, en caso de que exista.

 3. Resolver de existir la expresión de lado derecho.

 4. Aplicar el criterio que define el operador en medio de la expresión relacional, de cumplirse retornar verdad, de lo contrario falso.



  • EVALUACIÓN DE EXPRESIONES

       Las expresiones son secuencias de constantes y/o variables separadas por operadores válidos.

Se puede construir una expresión válida por medio de:

1. Una sola constante o variable, la cual puede estar precedida por un signo + ó - .

2. Una secuencia de términos (constantes, variables, funciones) separados por operadores.


Además debe considerarse que:
        Toda variable utilizada en una expresión debe tener un valor almacenado para que la expresión, al ser evaluada, dé como resultado un valor. Cualquier constante o variable puede ser reemplazada por una llamada a una función.


Como en las expresiones matemáticas, una expresión en Pascal se evalúa de acuerdo a la precedencia de operadores. La siguiente tabla muestra la precedencia de los operadores:


Precedencia de operadores

5     -  (Menos unario)

4       Not

3      * / div mod and shl shr

2      + - or xor

1           = <> > < >= <=


Las reglas de evaluación para las expresiones son:
                                                
1. Si todos los operadores en una expresión tienen la misma precedencia, la evaluación de las operaciones se realiza de izquierda a derecha.

2. Cuando los operadores sean de diferentes precedencias, se evalúan primero las operaciones de más alta precedencia (en una base de izquierda a derecha), luego se evalúan las de precedencia siguiente, y así sucesivamente.

3. Las reglas 1) y 2) pueden ser anuladas por la inclusión de paréntesis en una expresión.



Ejemplos:

1. 3 + 2*5 {*,+}

4 + 10 =14

2. 20*4 div 5


{Igual prioridad de izquierda a derecha: *,div}

3. 80 div 5 = 16

3 - 5 * (20+(6/2))

3 - 5 * (20+(6/2)) = 3 - 5 * (20 + 3)



{paréntesis más interno}

= 3 - 5 * 23 {segundo paréntesis}

= 3 - 115 {Multiplicación}

= -112 {resta}            


Jerarquía de operadores
          El orden general de evaluación de los operadores de una expresión va de izquierda a derecha, con la excepción de las asignaciones que lo hacen de derecha a izquierda.


Podemos seguir las siguientes tres reglas de evaluación de expresiones:


(Regla 1) En todas las expresiones se evalúan primero las expresiones de los paréntesis más anidados (interiores unos a otros); y éstos modifican la prioridad según la cantidad de éstos, los cuales tienen que estar balanceados (el mismo número de paréntesis que abren debe ser igual al número de los paréntesis que cierran).

(Regla 2) Todas las expresiones se evalúan tomando en cuenta la jerarquía de los operadores.

(Regla 3) Todas las expresiones se evalúan de izquierda a derecha.

   

No hay comentarios:

Publicar un comentario