Operadores
Fundamentos de programación/Programación I
2007-2008
Operadores
• Para manipular datos necesitamos operadores
• Cada operador está asociado con uno o más datos,
llamados operandos
• Los operadores pertenecen a una de las siguientes
categorías:
– unario:
– binario:
– ternario:
asociado con 1 operando
asociado con 2 operandos
asociado con 3 operandos
• Los operandos tienen que ser del tipo correcto
Clases de operadores
•
•
•
•
Operadores
Operadores
Operadores
Operadores
aritméticos
relacionales
lógicos
especiales
Operadores aritméticos
Categoría
Operandos
Significado
+ unario, binario enteros, reales
signo, adición
- unario, binario enteros, reales
signo, sustracción
* binario
enteros, reales
multiplicación
/ binario
enteros, reales
división
% binario
enteros, reales
resto
Operadores aritméticos
• Ejemplos:
int positivo = +7;
double suma = 3.0 + 5.0;
double negativo = -3.5;
double resta = valor - 2.0;
int producto = valor1 * valor2;
double cociente = valor / 12.0;
int resto = 12 % 5;
División y resto
• En Java, el resultado de una división de enteros es
siempre un entero (se trunca la parte decimal)
• Ejemplo:
int cociente = 15 / 4;
• El resto es la parte del numerador que no se usó para
la división
int resto = 15 % 4;
División y resto
• En Java, el resultado de una división de enteros es
siempre un entero (se trunca la parte decimal)
• Ejemplo:
int cociente = 15 / 4;
• El resto es la parte del numerador que no se usó para
la división
int resto = 15 % 4;
1
2
3
resto
15
4
Prioridad y asociatividad
• Es posible usar más que un operador en una
expresión:
int resultado = 2 + 4 * 3;
• El resultado de la expresión podría ser ambiguo:
(2 + 4) * 3 = 6 * 3 = 18
2 + (4 * 3) = 2 + 12 = 14
• Para resolver ambigüedad, Java utiliza prioridad y
asociatividad
Prioridad
• Los operadores no se evalúan al mismo tiempo
• Java tiene la siguiente prioridad de evaluación de los
operadores:
Prioridad
1
2
3
4
Operadores
+, *, /, %
+, =
Significado
signo
multiplicación, división, resto
adición, sustracción
asignación
Prioridad
• Ejemplo:
final = -27 * 2 + 35
final = -27 * 2 + 35
final = -27 * 2 + 35
final =
-54
+
final =
-54
+
final =
-51;
final =
-51;
/ 10;
/ 10;
/ 10;
3;
3;
Asociatividad
• Todavía podría existir ambigüedad:
resta = 5 – 2 - 1;
(5 – 2) – 1 = 3 – 1 = 2
5 – (2 – 1) = 5 – 1 = 4
• Para resolver ambigüedad de operadores aritméticos,
Java utiliza asociatividad izquierda-derecha:
resta = 5 – 2 – 1;
resta = 5 – 2 – 1;
resta =
3
– 1;
resta =
2;
Prioridad y asociatividad
• Se puede usar paréntesis para cambiar el orden usual
de evaluación:
double numero1 = 2 * 27 / 9 +
double numero2 = (2 * 27) / (9 +
int numero3 = 7 * 10 - 5 % 3
int numero4 = (7 * (10 - 5) % 3)
3;
3);
* 4 + 9;
* 4 + 9;
Generalidad de los tipos
• ¿Qué pasa si los operandos no son del mismo tipo?
• Se convierten automáticamente según el siguiente
orden de generalidad:
byte  short  int  long  float  double
• El resultado de una expresión se convierte al tipo
más general
Conversión de tipos
• Ejemplos:
double goodDouble = 17.5 + 4;
int badInt = 5 – 3.0;
float goodFloat = 491 + 5162631234L;
float badFloat = 16.2 / 7;
• ¡A veces el resultado no es lo que uno desea!
double cociente = 15 / 4;
Operaciones sobre enteros
• ¡Si ningún operando es un long, el resultado de una
operación sobre enteros es siempre un int!
• Ejemplo:
short short1 = 10;
short short2 = 20;
short badShort = short1 * short2;
Casting
• Es posible volver a un tipo menos general mientras una
operación llamada casting:
short goodShort = (short)(short1 * short2);
• ¡Casting tiene prioridad más alto que operadores
aritméticos!
short badShort = (short)short1 * short2;
• Si un real se convierte a un entero se trunca la parte
decimal:
int entero = (int)8.9; // entero = 8
Rango
• ¿Qué pasa si el resultado de una operación
aritmética sobrepasa el máximo valor?
• No habrá errores de compilación
• No obstante, podrá generar resultados raros:
byte valor = 127;
valor = valor + 1; // ¡valor = -128!
0
1
1
1
1
1
1
1
0
0
0
0
0
0
0
1
127
1
+
1
0
0
0
0
0
0
0
= -128
Operadores sobre caracteres
• Los caracteres se almacenan como números enteros
• Se puede hacer operaciones aritméticas sobre
caracteres:
char myChar = ‘a’;
int resta = myChar – 32;
• El resultado es siempre un entero
• Para volver a un carácter necesita usar casting:
char myChar = ‘a’;
myChar = (char)(myChar – 32); // ‘A’
Cadenas de caracteres: String
• Operador de concatenación:
String saludo = “Hola” + “ Jefe”;
Sytem.out.println(saludo); // “Hola Jefe”
• Operador de concatenación puede unir una cadena a
cualquier otro tipo o literal:
double sueldo = 1003.87;
String mensaje = “su sueldo es ” + sueldo;
String deletrear = ‘S’ + “ como sevilla”;
• ¡Uno de los operandos tiene que ser un String!
String badString = 13 + ‘S’;
Operadores abreviados
Categoría
Abreviado
No abreviado
+= binario
a += b
a = a + b
-= binario
a -= b
a = a – b
*= binario
a *= b
a = a * b
/= binario
a /= b
a = a / b
%= binario
a %= b
a = a % b
Incremento y decremento
• Java ha heredado operadores de incremento y
decremento de C y C++
• ¡Es la única forma de cambiar el valor de una variable
sin asignación!
Categoría
Abreviado
No abreviado
++ unario
++a, a++
a = a + 1
-- unario
--a, a--
a = a - 1
Incremento y decremento
• Prefijo: el valor cambia antes de ser evaluado
int a = 10;
int b = ++a; // resultado: a = 11, b = 11
• Postfijo: el valor cambia después de ser evaluado
int a = 10;
int b = a++; // resultado: a = 11, b = 10
Operadores relacionales
Categoría
Operandos
Significado
== binario
enteros, reales
igual
!=
binario
enteros, reales
distinto
>
binario
enteros, reales
mayor
>= binario
enteros, reales
mayor o igual
<
binario
enteros, reales
menor
<= binario
enteros, reales
menor o igual
Operadores relacionales
• El resultado de evaluar una expresión con un
operador relacional es siempre true o false
(boolean):
boolean b = 3 < 7;
boolean c = notaAsignatura > 9;
boolean d = 1 == 1;
Operadores relacionales
• ¿Cuál es el problema con la siguiente expresión?
boolean b = 3 < 4 < 5;
• La expresión se evalúa de izquierda a derecha:
boolean b = 3 < 4 < 5;
boolean b = 3 < 4 < 5;
boolean b = true < 5; // ???
Operadores lógicos
• Operan sobre datos boolean y devuelven también un
boolean
• Proposiciones lógicas:
Si has comido y bebido o estás enamorado y
no tienes deudas, entonces estás feliz.
Operadores lógicos
Categoría
Operandos
Significado
&& binario
boolean
Y lógica
|| binario
boolean
O lógica
^
binario
boolean
O exclusiva
!
unario
boolean
NO
Operadores lógicos
Si has comido y bebido o estás enamorado y
no tienes deudas, entonces estás feliz.
boolean
boolean
boolean
boolean
boolean
comido = true;
bebido = false;
enamorado = true;
deudas = false;
feliz = (comido && bebido) ||
(enamorado && !deudas);
Operadores lógicos
• En lógica, el valor true esta representado por un 1 y
el valor false por un 0
• Las tablas de verdad son la forma más usual de
mostrar los resultados de operaciones lógicas.
• Tabla de verdad de la negación (NO):
x
1
0
!x
0
1
b = !(3 > 5);
Operadores lógicos
• Tabla de verdad para la conyunción (Y) lógica:
x
1
1
y x && y
1
1
0
0
0
0
1
0
0
0
b = ((5 > 3) && (6*2 == 12));
b = (!(5 > 3) && (6*2 == 12));
Operadores lógicos
• Tabla de verdad para la disyunción (O) lógica:
x
1
1
y x || y
1
1
0
1
0
0
1
0
1
0
b = (!(5 > 3) || (6*2 == 12));
Operadores lógicos
• Tabla de verdad para la disyunción (O) exclusiva:
x
1
1
y
1
0
x ^ y
0
1
0
0
1
0
1
0
b = ((5 > 3) ^ (6*2 == 12));
Operadores lógicos
• Java evalúa conyunción lógica de izquierda a derecha
b = (5 < 3) && (6*2 == 12);
b = (5 < 3) && (6*2 == 12);
• Si el resultado de la expresión a la izquierda es
false, Java no evalúa la expresión a la derecha
• Lo mismo pasa con disyunción lógica cuando la
expresión a la izquierda es true
• Ejemplo: evitar división por cero
boolean b = (n != 0) && (x < 1.0/n)
Prioridad y asociatividad
• Determinan el orden de evaluación
• Los operadores se evalúan en orden de prioridad
• Si dos operadores tienen la misma prioridad, se
evalúan según asociatividad
• Asociatividad izquierda-derecha significa que el
operador a la izquierda se evalúa primero
• Siempre se puede utilizar paréntesis para cambiar el
orden de evaluación
Prioridad y asociatividad
1
()
2
4
+ - ++ -- ! (tipo) sgn/inc/dec/NO/casting der-izq
* / %
mult/div/resto
izq-der
+ - +
ad/sust/concatenación izq-der
5
> >= < <=
mayor/menor
izq-der
6
== !=
igual/distinto
izq-der
7
^
O exclusiva
izq-der
8
&&
Y lógica
izq-der
9
||
O lógica
izq-der
asignación
der-izq
3
10 = += -= *= /= %=
paréntesis
Concatenación
• Problema: añadir dos números e imprimir el resultado
en la pantalla
int n1 = 7;
int n2 = 5;
String s = “Resultado: ” + n1 + n2;
System.out.println(s);
• ¿Cuál es el problema?
Descargar

ppt