6 Sentencias y Expresiones¶
Sentencias¶
Una sentencia es la unidad mínima de ejecución de un programa. Un programa se compone de un conjunto de sentencias que acaban resolviendo un problema. Al final de cada una de las sentencias encontraremos un punto y coma (;
).
Veamos algunos ejemplos de sentencias en java:
- Sentencias de declaración: int x;
- Invocaciones o llamadas a métodos de tipo void:
System.out.println("Bienvenidos a Programación");
- Sentencias de control de flujo: alteran el flujo de ejecución para tomar decisiones o repetir sentencias.
Expresiones¶
Una expresión es una combinación de operadores y operandos que se evalúa generándose un único resultado de un tipo determinado.
La diferencia entre las sentencias y las expresiones es que las expresiones devuelven un valor y las sentencias no devuelven nada.
Prioridad entre operadores¶
A veces hay expresiones con operadores que resultan confusas. Por ejemplo:
resultado=8+4/2;
Es difícil saber el resultado. ¿Cuál es? ¿seis o diez? La respuesta es 10 y la razón es que el operador de división siempre precede en el orden de ejecución al de la suma. Es decir, siempre se ejecuta antes la división que la suma. Siempre se pueden usar paréntesis para forzar el orden deseado:
resultado=(8+4)/2;
Ahora no hay duda, el resultado es seis.
¿Cómo podemos saber en qué orden se van a ejecutar los operadores en una expresión en Java? Pues se ejecutan en función de una prioridad, es decir, primero se ejecuta el que tenga más prioridad. La siguiente tabla muestra todos los operadores Java ordenados de mayor a menor prioridad. La primera línea de la tabla contiene los operadores de mayor prioridad y la última los de menor prioridad. Los operadores que aparecen en la misma línea tienen la misma prioridad.
Cuando una expresión tenga dos operadores con la misma prioridad, la expresión se evalúa según su asociatividad.
Nivel | Operador | Descripción | Asociatividad |
---|---|---|---|
1 | [] . () | acceso elementos array acceso miembros objetos paréntesis | de izquierda a derecha |
2 | ++ -- | unario post-incremento unario post-incremento | no asociativos |
3 | ++ -- + - ! ~ | unario pre-incremento unario pre-decremento unario más unario menos unario lógico NOT unario NOT a nivel de bits | de derecha a izquierda |
4 | () new | cast creación objetos | de derecha a izquierda |
5 | * / % | multiplicación división módulo | de izquierda a derecha |
6 | + - + | suma resta concatenación cadenas | de izquierda a derecha |
7 | << >> >>> | desplazamiento a nivel de bits | de izquierda a derecha |
8 | < <= > >= instanceof | relacionales | no asociativos |
9 | == != | igual distinto | de izquierda a derecha |
10 | & | AND nivel de bits | de izquierda a derecha |
11 | ^ | XOR nivel de bits | de izquierda a derecha |
12 | | | OR nivel de bits | de izquierda a derecha |
13 | && | AND | de izquierda a derecha |
14 | || | OR | de izquierda a derecha |
15 | ?: | ternario condicional | de derecha a izquierda |
16 | = += -= *= /= %= &= ^ |= <<<= >>= >>= | asignaciones | de derecha a izquierda |
Por ejemplo:resultado = 9 / 3 * 3;
En este caso, la multiplicación y la división tienen la misma prioridad y su asociatividad es de izquierda a derecha por lo que se realiza primero la operación que esté más a la izquierda, que en este caso es la división. El resultado por lo tanto es nueve. Si se desea que se haga primero la multiplicación, habría que utilizar un paréntesis: resultado = 9 / (3 * 3);
En este caso, el resultado sería 1.
Otro ejemplo: x = y = z = 17;
Como la asociatividad de la asignación es de derecha a izquierda, primero se asigna el valor 17 a z
, luego a y
y por último a x
.Esto se puede realizar porque el operador de asignación devuelve el valor asignado.
Algunos operadores son no asociativos, por ejemplo, la expresión x <= y <= z
es inválida ya que el valor devuelto por estos operadores es de un tipo diferente (booleano) al de los operandos que necesita (numérico o carácter).
Evaluación de cortocircuito¶
La evaluación de cortocircuito denota la semántica de algunos operadores booleanos en algunos lenguajes de programación en los cuales si con la evaluación de la primera expresión ya se conoce el resultado, ya no se evalúan el resto de expresiones. En Java, se utiliza la evaluación de cortocircuito.
Por ejemplo, veamos la siguiente expresión que utiliza operadores AND
:
Se evalúa la primera expresión 12 < 9
dando false. Como el resultado va a ser false independientemente del resultado de la segunda y tercera expresión, entonces no se evalúan ni la segunda 5 > 1
ni la tercera expresión 8<= 13
, sino que solamente se evalúa la primera, dando como resultado false. Lo mismo ocurre con el operador OR
:
Se evalúa la primera expresión 8 <= 13
dando true. Como el resultado va a ser true independientemente del resultado de la segunda y tercera expresión, entonces no se evalúan ni la segunda 12 < 9
ni la tercera expresión 5 > 1
, sino que solamente se evalúa la primera, dando como resultado true.
Ejercicio 1
Suponiendo realizadas las siguientes sentencias de asignación: lado1 = 3; precio = 325,6; lado2 = 4; comprar = false; hipotenusa = 5; ch = '7'. Determinar cuáles de las expresiones siguientes dan un resultado booleano y cuáles no. Para aquellas que produzcan un resultado booleano determinar si el resultado es verdadero o falso. Para las que no lo sean, explicar la razón. Indicar también si existe alguna expresión errónea, y crea una aplicación Java para comprobar los resultados.
- 5 * precio - 1.50
- (precio < 300 + 0.1 * precio) ||comprar
- sqrt(lado1) + sqrt(lado2) = sqrt(hipotenusa)
- (!comprar) && (precio + 125.3)
- (ch <= 'A') && comprar
- ch = '7' || !comprar
Ejercicio 2
Calcula el resultado de las siguientes expresiones de forma manual, y luego creando un programa JAVA:
- 3 * 5 - 4 / 2
- 3 - (3*5)2 / 4
- 32 - 5 * 2
- 7 - 4 * 2 - 5 * 2
- 5 + 4 < 7 + 8
- 4 < 5 * 4 / 2 - 7
- 3 + 6 * 14
- 8 + 7 * 3 + 4 * 6
- -4 * 7 + 23 / 4 - 5
- 12 + 3 * 7 + 5 * 4
- !(4 > 6)
- 73 / 2 + 6
Ejercicio 3
Dados los siguientes valores para las variables booleanas a,b y c (a = true, b = false y c = true), evaluar las expresiones que aparecen a continuación y crear un programa JAVA para comprobar las soluciones:
- a && b || a && c
- (a || b) && (!a || c)
- a || b && c
- !(a || b) && c
Ejercicio 4
Dado los siguientes valores de las variables x, y, j y k, añadir los paréntesis que sean necesarios para que las expresiones que las siguen evalúen a verdadero: x = 10; y = 19; j = true; k = false.
- x == y || j
- x >= y || x <=y && j
- !j || j
- !k && k
Ejercicio 5
Sea n un dato de tipo Entero que suponemos positivo. Empareja las expresiones con la descripción que les corresponda:
a) El mayor número par no superior a n.
b) El primer número par mayor o igual que n
c) El primer impar mayor o igual que n
1) (n / 2)*2
2) n + (n+1) % 2
3) ((n+1)/2)*2