Академический Документы
Профессиональный Документы
Культура Документы
43
4. Operadores
Objetivos: a) Describir los operadores (aritmticos, incrementales, de relacin, lgicos y de asignacin) y los tipos de dato primitivos sobre los que actan b) Evaluar expresiones que empleen datos primitivos, operadores y parntesis c) Construir expresiones que empleen combinaciones de datos primitivos, operadores y parntesis Un operador lleva a cabo operaciones sobre uno (operador unario), dos (operador binario) o tres (operador ternario) datos u operandos de tipo primitvo devolviendo un valor determinado tambin de un tipo primitivo. El tipo de valor devuelto tras la evaluacin depende del operador y del tipo de los operandos. Por ejemplo, los operadores aritmticos trabajan con operandos numricos, llevan a cabo operaciones aritmticas bsicas y devuelven el valor numrico correspondiente. Los operadores se pueden clasificar en distintos grupos segn se muestra en los siguientes apartados.
Operador =
Ejemplo de expresin n = 4
No debe confundirse el operador asignacin (=) con el operador relacional de igualdad (==) que se ver ms adelante. Adems Java dispone de otros operadores que combinan la asignacin con otras operaciones (operadores aritmticos combinados). En el siguiente cdigo se muestran algunos ejemplos de uso del operador asignacin con datos de distintos tipos:
/** * Demostracion del operador asignacion * A. Garcia-Beltran - Abril, 2008 */ public class opAsignacion { public static void main(String[] args) { int i,j; double x; char c; boolean b; String s; i = 15; j = i; x = 12.345; c = 'A'; b = false; s = "Hola";
44
= = = = = =
+ + + + + +
Operador + * / %
Descripcin operador unario de cambio de signo Suma Resta Producto Divisin (tanto entera como real) Resto de la divisin entera
Ejemplo de expresin -4 2.5 + 7.1 235.6 - 103.5 1.2 * 1.1 0.050 / 0.2 7 / 2 20 % 7
El resultado exacto depende de los tipos de operando involucrados. Es conveniente tener en cuenta las siguientes peculiaridades: El resultado es de tipo long si, al menos, uno de los operandos es de tipo long y ninguno es real (float o double). El resultado es de tipo int si ninguno de los operandos es de tipo long y tampoco es real (float o double). El resultado es de tipo double si, al menos, uno de los operandos es de tipo double. El resultado es de tipo float si, al menos, uno de los operandos es de tipo float y ninguno es double. El formato empleado para la representacin de datos enteros es el complemento a dos. En la aritmtica entera no se producen nunca desbordamientos (overflow) aunque el resultado sobrepase el intervalo de representacin (int o long).
45
La divisin entera se trunca hacia 0. La divisin o el resto de dividir por cero es una operacin vlida que genera una excepcin ArithmeticException que puede dar lugar a un error de ejecucin y la consiguiente interrupcin de la ejecucin del programa. La aritmtica real (en coma flotante) puede desbordar al infinito (demasiado grande, overflow) o hacia cero (demasiado pequeo, underflow). El resultado de una expresin invlida, por ejemplo, dividir infinito por infinito, no genera una excepcin ni un error de ejecucin: es un valor NaN (Not a Number). En el siguiente programa se emplean todos los operadores aritmticos anteriores:
/** * Demostracion de los operadores aritmeticos * A. Garcia-Beltran - marzo, 2008 */ public class OpAritmeticos { public static void main(String[] args) { int i,j; double a,b; i = 7; j = 3; System.out.println("* Operandos enteros: System.out.println(" Operador suma: System.out.println(" Operador resta: System.out.println(" Operador producto: System.out.println(" Operador division: System.out.println(" Operador resto: a = 12.5; b = 4.3; System.out.println("* Operandos reales: System.out.println(" Operador suma: System.out.println(" Operador resta: System.out.println(" Operador producto: System.out.println(" Operador division: System.out.println(" Operador resto: } }
basicos
i i i i i i a a a a a a
= + * / % = + * / %
" j j j j j " b b b b b
+ = = = = = + = = = = =
i " " " " " a " " " " "
+ + + + + + + + + + + +
" ; j = " + j); (i+j)); (i-j)); (i*j)); (i/j)); (i%j)); " ; b = " + b); (a+b)); (a-b)); (a*b)); (a/b)); (a%b));
46
Operador ++
--
Ejemplo de expresin 4++ Incremento a=5; i++ primero se utiliza la variable y luego se b=a++; incrementa su valor ++i primero se incrementa el valor de la variable a=5; b=++a; y luego se utiliza 4-decremento Descripcin
Estos operadores suelen sustituir a veces al operador asignacin y tambin suelen aparecer en bucles for. Ejemplo de programa que emplea operadores incrementales:
/** * Demostracion de los operadores incrementales * A. Garcia-Beltran - Abril, 2008 */ class opIncrementales { public static void main(String[] args) { int i,j; // Variables enteras. Podrian ser reales o char i = 7; System.out.println("* Operando entero: i = " + i + ";"); System.out.println(" Operador ++: j = i++; "); j = i++; System.out.println(" // i vale " + i + "; j vale " i = 7; System.out.println(" i = " + i + ";"); System.out.println(" j = ++i; "); j = ++i; System.out.println(" // i vale " + i + "; j vale " i = 7; System.out.println("* Operando entero: i = " + i + ";"); System.out.println(" Operador --: j = i--; "); j = i--; System.out.println(" // i vale " + i + "; j vale " i = 7; System.out.println(" i = " + i + ";"); System.out.println(" j = --i; "); j = --i; System.out.println(" // i vale " + i + "; j vale " } }
+ j);
+ j);
+ j);
+ j);
47
Operador += -= *= /= %=
Descripcin Suma combinada Resta combinada Producto combinado Divisin combinada Resto combinado
/** * Demostracion de los operadores aritmeticos combinados * A. Garcia-Beltran - marzo, 2008 */ public class OpCombinados { public static void main(String[] args) { int i,j; // Variables enteras. Podrian ser reales i = 7; j = 3; System.out.println("* Operandos enteros: i = "+ i i += j; System.out.println(" Suma combinada: i += j " i = 7; i -= j; System.out.println(" Resta combinada: i -= j " i = 7; i *= j; System.out.println(" Producto combinado: i *= j " i = 7; i /= j; System.out.println(" Division combinada: i /= j " i = 7; i %= j; System.out.println(" Resto combinada: i %= j " } }
+" ; + "
+ "
+ "
+ "
+ "
48
i i i i
-= *= /= %=
j j j j
// // // //
i i i i
4 21 2 1
Descripcin igual que distinto que menor que mayor que menor o igual que mayor o igual que
Ejemplo de expresin 7 == 38 'a' != 'k' 'G' < 'B' 'b' > 'a' 7.5 <= 7.38 38 >= 7
Todos los valores numricos que se comparan con NaN dan como resultado false excepto el operador != que devuelve true. Esto ocurre incluso si ambos valores son NaN. Ejemplo de programa que emplea operadores relacionales:
/** * Demostracion de los operadores relacionales * A. Garcia-Beltran - marzo, 2008 */ public class OpRelacionales { public static void main(String[] args) { int i,j; i = 7; j = 3; System.out.println("* Operandos enteros: i System.out.println(" Operador igualdad: i System.out.println(" Operador desigualdad: i System.out.println(" Operador mayor que: i System.out.println(" Operador menor que: i System.out.println(" Operador mayor o igual que: i System.out.println(" Operador menor o igual que: i } }
; + + + + + +
49
Operador ! | ^ & ||
Descripcin Negacin - NOT (unario) Suma lgica OR (binario) Suma lgica exclusiva XOR (binario) Producto lgico AND (binario) Suma lgica con cortocircuito: si el primer operando es true entonces el segundo se salta y el resultado es true Producto lgico con cortocircuito: si el primer operando es false entonces el segundo se salta y el resultado es false
Ejemplo de expresin !false !(5==5) true | false (5==5)|(5<4) true ^ false (5==5)|(5<4) true & false (5==5)&(5<4) true || false (5==5)||(5<4) false && true (5==5)&&(5<4)
Resultado del ejemplo true false true true true true false false true true false false
&&
Para mejorar el rendimiento de ejecucin del cdigo es recomendable emplear en las expresiones booleanas el operador && en lugar del operador &. En este caso es conveniente situar la condicin ms propensa a ser falsa en el trmino de la izquierda. Esta tcnica puede reducir el tiempo de ejecucin del programa. De forma equivalente es preferible emplear el operador || al operador |. En este caso es conveniente colocar la condicin ms propensa a ser verdadera en el trmino de la izquierda. Ejemplo de programa que emplea operadores lgicos:
/** * Demostracion de los operadores logicos * A. Garcia-Beltran - marzo, 2008 */ public class OpBooleanos { public static void main(String [] args) { System.out.println("Demostracion de operadores System.out.println("Negacion: ! false es System.out.println(" ! true es System.out.println("Suma: false | false es System.out.println(" false | true es System.out.println(" true | false es System.out.println(" true | true es System.out.println("Producto: false & false es System.out.println(" false & true es System.out.println(" true & false es System.out.println(" true & true es } }
logicos"); : " + (! false)); : " + (! true)); : " + (false | false)); : " + (false | true)); : " + (true | false)); : " + (true | true)); : " + (false & false)); : " + (false & true)); : " + (true & false)); : " + (true & true));
50
Si el resultado de evaluar la expresin lgica es verdadero, devuelve el valor de la primera expresin, y en caso contrario, devuelve el valor de la segunda expresin.
Tabla 4.7 Operador condicional
Operador :
La sentencia de asignacin:
valor = (expresionLogica ? expresion_1 : expresion_2);
51
System.out.println("k = " i = 2; j = 1; k = i > j ? 2*i : 3*j+1; System.out.println("i = " System.out.println("j = " System.out.println("k = " } }
+ k);
Descripcin Negacin complemento binario (unario) Suma lgica binaria OR (binario) Suma lgica exclusiva XOR (binario) Producto lgico binario AND (binario) Desplaza a la izquierda los bits del 1 operando tantas veces como indica el 2 operando (por la derecha siempre entra un cero) Desplaza a la derecha los bits del 1 operando tantas veces como indica el 2 operando (por la izquierda
entra siempre el mismo bit ms significativo anterior)
Ejemplo de expresin
~12 12|10 12^10 12&10 7<<2 -7<<2 7>>2 -7>>2 7>>>2 -7>>>2
>>
>>>
Desplaza a la derecha los bits del 1 operando tantas veces como indica el 2 operando sin signo (por la
izquierda entra siempre un cero).
i = " + i + " ;
j = " + j);
52
System.out.println(" System.out.println(" System.out.println(" System.out.println(" i = 12; j = -10; System.out.println("* System.out.println(" System.out.println(" System.out.println(" System.out.println(" i = 7; j = 2; System.out.println("* System.out.println(" System.out.println(" System.out.println(" i = -7; j = 2; System.out.println("* System.out.println(" System.out.println(" System.out.println(" } }
Negacion o complemento: Suma logica (binaria): Suma exclusiva (binaria): Producto logico (binaria):
~i es i & j i ^ j i | j
Operandos enteros: i = " + i + " ; j = " + j); Negacion o complemento: ~i es " + (~i)); Suma logica (binaria): i & j es " + (i&j)); Suma exclusiva (binaria): i ^ j es " + (i^j)); Producto logico (binaria): i | j es " + (i|j)); Operandos enteros: i = " + i + " ; Despl. a izquierdas: i << j es " + Despl. a derechas: i >> j es " + Despl. a derechas sin signo: i >>> j es " j = " + j); (i<<j)); (i>>j)); + (i>>>j));
Operandos enteros: i = " + i + " ; j = " + j); Desplazamiento a izquierdas: i << j es " + (i<<j)); Despl. a derechas: i >> j es "+ (i>>j)); Despl. a derechas sin signo: i >>> j es " + (i>>>j));
Operador +
53
4.10. Separadores
Existen algunos caracteres que tienen un significado especial en el lenguaje Java. En la Tabla 4.10 se resumen los diferentes separadores que pueden encontrarse en el cdigo fuente de un programa.
Tabla 4.10 Separadores en Java
Separador Descripcin () Permiten modificar la prioridad de una expresin, contener expresiones para el control de flujo y realizar conversiones de tipo. Por otro lado pueden contener la lista de parmetros o argumentos, tanto en la definicin de un mtodo como en la llamada al mismo. {} Permiten definir bloques de cdigo y mbitos y contener los valores iniciales de las variables array [] Permiten declarar variables de tipo array (vectores o matrices) y referenciar sus elementos ; Permite separar sentencias , Permite separar identificadores consecutivos en la declaracin de variables y en las listas de parmetros. Tambin se emplea para encadenar sentencias dentro de un bucle for . Permite separar el nombre de un atributo o mtodo de su instancia de referencia. Tambin separa el identificador de un paquete de los de los subpaquetes y clases
4.11. Expresiones
Una expresin es una combinacin de operadores y operandos que se evala generndose un nico resultado de un tipo determinado.
54
Prior.
1
Operador
++ -+, ~ (tipo) *, /, % +, + << >> >>> <, <= >, >= instanceof == = == = & & ^ ^ | | && || ? :
Tipo de operador
Aritmtico Aritmtico Aritmtico Integral Booleano Cualquiera Aritmtico Aritmtico Cadena Integral Integral Integral Aritmtico Aritmtico Objeto, tipo Primitivo Primitivo Objeto Objeto Integral Booleano Integral Booleano Integral Booleano Booleano Booleano Booleano, cualquiera, cualquiera Variable, cualquiera
Operacin
Incremento previo o posterior (unario) Incremento previo o posterior (unario) Suma unaria, Resta unaria Cambio de bits (unario) Negacin (unario) Multiplicacin, divisin, resto Suma, resta Concatenacin de cadenas Desplazamiento de bits a izquierda Desplazamiento de bits a derecha con inclusin de signo Desplazamiento de bits a derecha con inclusin de cero Menor que, Menor o igual que Mayor que, Mayor o igual que Comparacin de tipos Igual (valores idnticos) Desigual (valores diferentes) Igual (referencia al mismo objeto) Desigual (referencia a distintos objetos) Cambio de bits AND Producto booleano Cambio de bits XOR Suma exclusiva booleana Cambio de bits OR Suma booleana AND condicional OR condicional Operador condicional (ternario)
2 3 4 5
8 9 10 11 12 13
14