G.Bordel >Docencia >TAP Técnicas Actuales de Programación (curso 2010-2011)
desprotegido Intro. desprotegido Temario desprotegido Calendario desprotegido RPF desprotegido Recursos protegido Práctica protegido Gest. Alum.
tema_anterior Tema 3: Elementos básicos del lenguaje tema_siguiente
  1. Introducción.
  2. Tipos de datos, identificadores y literales.
  3. Operadores.
  4. Sentencias.[ejercicios]

3.3- Operadores

Palabras reservadas en Java
abstractbooleanbreakbytecasecatch
charclassconst*continuedefaultdo
doubleelseextendsfinalfinallyfloat
forgoto*ifimplementsimportinstanceof
intinterfacelongnativenewpackage
privateprotectedpublicreturnshortstatic
strictfp**superswitchsynchronizedthisthrow
throwstransienttryvoidvolatilewhile

Operador de asignación

La asignación es una operación básica en un computador que representa la copia de datos de un determinado lugar a otro de la memoria. En los lenguajes de alto nivel, estos lugares origen y destino de los datos estan representados por variables, y no siempre resulta trivial el comportamiento del operador de asignación, sino que puede depender del tratamiento que el lenguaje realice con los distintos tipos de variables. En Java esto no es un problema, ya que su función es lo más símple posible: para tipos primitivos hace una copia del origen (el operando de la derecha) en el destino (el de la izquierda), y en el caso de objetos y arrays copia la referencia, de modo que se dispone de dos variables refiriendose al mismo objeto o array. Para llevar a cabo copias de estructuras complejas (objetos o arrays) se recurre a otro "sistema" que se estudiará en su momento.

Operadores aritméticos

Los operadores aritméticos tienen el comportamiento normal que presentan en cualquier lenguaje de programación y en concreto coinciden en su sintaxis plenamente con el lenguaje C.

Para quienes desconozcan el lenguaje C, hay que aclarar el funcionamiento de los operadores decremento ("--") e incremento ("++"). Estos operadores realizan respectivamente un decremento e incremento de una unidad sobre la variable a que se aplican, pero tienen la particularidad de que su aplicación es distinta en función de que se escriban a la derecha o la la izquierda de esta. Realmente la diferencia es efectiva únicamente cuando la variable participa en una expresión, ya que esta estriba en el orden en que se lee su valor para calcular la expresión y se aplica el decremento o incremento.

Como puede verse en la siguiente figura, si el operador va por delante de la variable, primero se aplica este y después se evalua la expresión, de modo que se cuenta con el valor actualizado de la variable. En el caso de que el operador vaya detrás sucede lo contrario: primero se evalua la expresión, de modo que el valor de la variable utilizado es el original, y después se aplica el incremento o decremento a esta.

Operadores relacionales

Los operadores relacionales pueden verse en la siguiente tabla. La primera observación a realizar es para los conocedores del lenguaje C. El test de igualdad compara los dos operandos a sus lados dando lugar a un resultado booleano (true o false), y no puede ser nunca confundido con una asignación ya que Java (a diferencia de C) no admite valores enteros con interpretación booleana (p.ej. en C x=5 en puede evaluarse como true mientras que en Java no puede evaluarse como booleano).

Otra observación de interés es la referente a los operadores "&&" y "||" frente a los "&" y "|". Los primeros realizan una evaluación condicional, lo que quiere decir que pueden llegar a no evaluar parte de la expresión si esto no es necesario para obtener su resultado. En el caso de "op1 && op2", si "op1" es false, no será necesario evaluar "op2" ya que el resultado será false independientemente de su valor. Del mismo modo para "op1 || op2", si "op1" es true, no será necesario evaluar "op2" ya que el resultado será true independientemente de su valor. Por el contrario los operadores "&" y "|" realizan la evaluación completa, lo que puede ser de utilidad cuando las espresiones del operando "op2" puedan incluir operaciones efectivas (asignaciones, incrementos o decrementos, funciones).

Operadores de desplazamiento y lógicos

La tabla siguiente muestra los operadores de desplazamiento y de lógica. Obsérvese cómo los símbolos "&" y "|" coinciden con los vistos en el apartado anterior para otras operaciones. No hay ambiguedad posible ya que los anteriores se aplican a operandos booleanos mientras que estos se aplican a operandos enteros. El compilador "conoce" la operación a realizar en función de los operandos que encuentra en torno al operador. Como curiosidad podemos mencionar que los desarrolladores de Java consideraron perjudicial una de las características propias de muchos lenguajes orientados a objeto: la sobrecarga de operadores. Esta consiste en el uso de un mismo operador sobre distintos tipos para "simular" la disponibilidad de una misma operación sobre ellos cuando en realidad su especificidad hace que internamente sean operaciones distintas. De este modo Java es un lenguaje sin sobrecarga de operadores, lo que no quita para que estos que nos ocupan se utilicen en dos situaciones diferentes (lo que sucede es que no pretenden aplicar una misma operación a distintos tipos).

Operadores de asignación combinados

Los operadores de asignación combinados que se pueden ver en la tabla siguiente son una simple ayuda para la simplificación del código. Ejecutan una determinada operación entre sus dos operandos dejando el resultado en el primero de ellos. Por tanto permiten escribir expresiones de asignación evitando la escritura repetida del op1.

Otros operadores

De entre los elementos que se encuentran en la siguiente tabla cabe distinguir algunos que posiblemente el programador no avisado no considere como tal. Es el caso de los corchetes en las declaraciones de arrays o de los parentesis en las declaraciones o invocaciones de métodos, por ejemplo. De todos modos el hecho de que se trate de operadores no tiene mayor consecuencia. Sí es de notar aquí la presencia de dos operadores especificados mediante palabras reservadas: "new" e "instanceof". Se trata de dos operadores que se aplican a objetos, por lo que su utilidad concreta se verá más adelante. En todo caso ya vimos desde un primer momento (en el programa HolaMundo) la palabra reservada "new" que se utilizaba para generar ("instanciar" en la terminología al uso) un nuevo objeto [§4.6].

Obsérvese la existrencia de un operador ternario (con tres operandos) heredado de C. Permite generar una expresión condicionada: la primera expresión determina uan condición que en caso de evaluarse a true hace que el conjunto sea equivalente a la segunda expresión y en caso de evaluarse a false lo sea a la tercera. La siguiente figura es un ejemplo de su funcionamiento.

Precedencia y asociatividad en expresiones

En la especificación de toda expresión deben seguirse unas reglas que eliminen toda posible ambiguedad, ya que el orden de evaluación influye en la obtención del resultado. Por lo tanto veamos cuales son esas reglas. En principio hay que hablar de precedencia, es decir de "prioridad" en la aplicación de unos operadores sobre otros. La siguiente figura muestra los operadores ordenados en dierentes filas con los de máxima precedencia arriba y los de minima abajo. Este orden da lugar a una escritura de expresiones "razonable" con los criterios habituales en la escritura matemática, en calculadoras o en otros lenguajes de programación. En el caso de encontrar operadores de un mismo nivel de precedencia, la prioridad se determina por posición, evaluando la expresión de derecha a izquierda o al revés según se indica en la columna etiquetada como "asociatividad".

Siguiente punto: 3.4- Sentencias


Plataforma de soporte a curso y contenidos (c) German Bordel 2005.