Apuntes Java: Control de la ejecución – I

Resumen de operadores

La siguiente tabla muestra un resumen de operadores clasificados por grupos:

Grupo de operador Operador Significado
Aritméticos +
-
*
/
%
Suma
Resta
Multiplicación
División
Resto
Relacionales >
>=
<
<=
==
!=
Mayor
Mayor o igual
Menor
Menor o igual
Igual
Distinto
Logicos &&
||
!
AND
OR
NOT
A nivel de bits &
|
^
<<
>>
>>>
AND
OR
NOT
Desplazamiento a la izquierda
Desplazamiento a la derecha rellenando con 1
Desplazamiento a la derecha rellenando con 0
Otros +
++
--
=
+=
-=
*=
/=
?:
Concatenación de cadenas
Autoincremento (actúa como prefijo o sufijo)
Autodecremento (actúa como preficjo o sufijo)
Asignación
Suma y asignación
Resta y asignación
Multiplicación y asignación
División y asignación
Condicional
  • El significado de algunos operadores depende del tipo de datos sobre el que actúa Por ejemplo, en la expresión a + b el operador puede ser de suma (aritmético) si las variables a y b son de tipo numérico (int, long, etc.), o de concatenación si las variables a y B son Strings. (Los strings se verán en una lección posterior).
  • Es importante observar que el operador de igualdad es distinto al operador de asignación que hemos ido viendo en lecciones anteriores. La asignación se hace con un símbolo =, y la operación de comparación por igual con dos: ==
  • Los operadores relacionales producen siempre un resultado de tipo booleano, es decir true o false.
  • Los operadores de autoincremento y autodecremento pueden actuar de distinta forma según estén colocados como prefijo o como sufijo. El ejemplo lo aclara:
int i = 0;
int a = i++; // equivale a: a = i; i = i + 1; Primero se usa la variable y después se incrementa.
int b = ++i; // equivale a: i = i + 1; b = i; Primero se incrementa la variable y después se usa.
  • Los operadores de suma y asignación (igual que los de las otras operaciones básicas y asignación) actúan de la siguiente forma:
int b = 5;
int i;
i += b; // equivale a i = i + b;
  • El operador condicional ?: es un operador terciario (Necesita tres expresiones). Su sintaxis es:

(expresión) ? valor_si_cierto : valor si falso

Ejemplo:

int a;
int b = 5;
a = (b == 1) ? 0 : b; // Si b vale 1 se asigna a a el valor 0. En caso contrario se asigna el valor de b.

Ejecución condicional

El formato general es:

 if (expresion_booleana) bloque_de_código
 [else bloque_de_código]

bloque_de_código puede ser:

  • Una sola sentencia.
  • Un conjunto de sentencias separadas por ; y encerradas entre llaves, { y }:
{
    sentencia1;
    sentencia2;
    . . . 
}

expresion_booleana es una expresión que se evalúa como true o false (es decir, de tipo booleano). Si el resultado es true la ejecución bifurca a la sentencia que sigue al if . En caso contrario se bifurca a la sentencia que sigue al else.

Los corchetes en el formato anterior indican que la clausula else es opcional.

Las sentencias if pueden anidarse. Es decir, en el bloque de código correspondiente al if o al else (o a ambos), puede encontrarse otra sentencia if. Cuando esto se produce, puede ocurrir que sea difícil determinar a que else corresponde cada if. Para evitar esta fuente de errores se pueden usar las llaves {}, aunque sólo haya una sentencia en el bloque. Por ejemplo:

if (a == b) {
   if (a == c) {
       . . .
   }
   else {
       . . .
   }
}

En el ejemplo el else corresponde al if más interno (expresión a == c). Si correspondiera al if más externo debería escribirse así:

if (a == b) {
   if (a == c) {
       . . .
   }
}
else {
   . . .
}

Evaluación múltiple

La sentencia switch permite una evaluación múltiple, como si se encadenaran varias sentencias if . El formato es:

switch ( expresion ) {
    case valor:
        sentencias;
        break;
    case valor:
        sentencias;
        break;
        . . .
    default:
        sentencias;
} 

En la sentencia switch, expresión debe dar un resultado de uno de los tipos siguientes:

  • Un valor numérico de tipo byte, short, int.
  • Un caracter. Tipo char.
  • Un String.
  • Un tipo enumerado (Los tipos enumerados -enum- se verán más adelante).

Se ejecuta el bloque case cuyo valor coincida con el resultado de la expresión de la clausula switch . Se ejecuta hasta que se encuentra una sentencia break o se llega al final del switch .

Si ningún valor de case coincide con el resultado de la expresión entera se ejecuta el bloque default(si está presente).

default y break son opcionales.

Ejemplo: Un método que devuelve el número de días del mes, que se pasa como parámetro:

int diasDelMes (int mes) {
    int nDias = 0;
    switch (mes) {
        case 2:
            nDías = 28; // para ser más precisos deberíamos conocer el año, para saber si es bisiesto.
            break;
        case 4: case 6: case 9: case 11: // Varios case consecutivos a los que se aplica el mismo bloque de código.
            nDias = 30;
            break;
        default: // valor por defecto
            nDias = 31;
    }
    return nDias;
}

Devolución de control

El formato es:
return valor
Se utiliza en los métodos para terminar la ejecución y devolver un valor a quien lo llamó.

valor debe ser del tipo declarado en el método.

valor es opcional. No debe existir cuando el método se declara de tipo void. En este caso, la claúsula return al final del método es opcional, pero puede usarse para devolver el control al llamador en cualquier momento.

Última actualización: 3/11/2016