La precedencia indica qué operadores se evalúan primero en una expresión lógica. Conocerla evita ambigüedades y ayuda a escribir condiciones correctas.
Cuando una expresión lógica contiene varios operadores, necesitamos saber en qué orden se evalúan. Ese orden se llama precedencia o prioridad de operadores.
Por ejemplo, la expresión ¬p ∨ q ∧ r puede resultar confusa si no sabemos qué parte se evalúa primero.
La precedencia define qué operador se aplica antes cuando una expresión no tiene paréntesis suficientes.
Esto es similar a lo que ocurre en aritmética: en 2 + 3 × 4, primero se evalúa la multiplicación y luego la suma.
En lógica proposicional se suele usar el siguiente orden de precedencia:
| Prioridad | Operador | Nombre |
|---|---|---|
| 1 | ¬ | Negación |
| 2 | ∧ | Conjunción |
| 3 | ∨ | Disyunción |
| 4 | → | Implicación |
| 5 | ↔ | Bicondicional |
La negación tiene mayor prioridad que la conjunción, y la conjunción tiene mayor prioridad que la disyunción.
Los paréntesis tienen la máxima prioridad. Permiten indicar explícitamente qué parte debe evaluarse antes.
| Expresión | Agrupación |
|---|---|
| p ∨ q ∧ r | p ∨ (q ∧ r) |
| (p ∨ q) ∧ r | Se fuerza primero p ∨ q |
| ¬p ∧ q | (¬p) ∧ q |
| ¬(p ∧ q) | Se niega toda la conjunción |
Analicemos la expresión:
Por precedencia, se interpreta así:
Primero se evalúa la negación, luego la conjunción y finalmente la disyunción.
Supongamos los siguientes valores:
Evaluamos ¬p ∨ q ∧ r:
En JavaScript, los operadores lógicos principales también tienen un orden de precedencia.
| Prioridad | Operador | Nombre |
|---|---|---|
| 1 | ! | Negación lógica |
| 2 | && | AND lógico |
| 3 | || | OR lógico |
Esto significa que !p || q && r se interpreta como (!p) || (q && r).
const p = true;
const q = true;
const r = false;
const resultado = !p || q && r;
console.log(resultado);
Primero se evalúa !p, luego q && r, y finalmente el operador ||.
Aunque conozcamos la precedencia, muchas veces conviene escribir paréntesis para que la intención sea evidente.
const resultado = (!p) || (q && r);
Esta forma no cambia el resultado, pero mejora la lectura. En código de producción, la claridad suele ser más importante que ahorrar caracteres.
Comparemos dos expresiones parecidas:
| Expresión | Agrupación |
|---|---|
| p || q && r | p || (q && r) |
| (p || q) && r | Se evalúa primero p || q |
Estas expresiones pueden producir resultados diferentes.
const p = true;
const q = false;
const r = false;
console.log(p || q && r);
console.log((p || q) && r);
La negación tiene alta precedencia, por eso es importante usar paréntesis cuando queremos negar una expresión completa.
| Expresión | Significado |
|---|---|
| !p && q | Se niega p y luego se combina con q |
| !(p && q) | Se niega toda la conjunción |
| !p || q | Se niega p y luego se aplica OR con q |
| !(p || q) | Se niega toda la disyunción |
En código, una expresión lógica debe ser correcta y fácil de leer.
Esta expresión funciona, pero cuesta leerla:
const puedeEditar = esAdmin || esAutor && !documentoBloqueado && cuentaActiva;
Podemos escribirla con grupos más claros:
const autorPuedeEditar = esAutor && !documentoBloqueado;
const puedeEditar = (esAdmin || autorPuedeEditar) && cuentaActiva;
La segunda versión comunica mejor la regla.
Un error de agrupación puede cambiar una regla de permisos.
| Expresión | Interpretación |
|---|---|
| esAdmin || esEditor && cuentaActiva | Admin siempre accede; editor necesita cuenta activa |
| (esAdmin || esEditor) && cuentaActiva | Admin o editor acceden solo si la cuenta está activa |
Las dos reglas no son equivalentes. Por eso los paréntesis no son solo un detalle de estilo.
La precedencia de operadores permite interpretar expresiones lógicas sin ambigüedad. Sin embargo, en programación es recomendable usar paréntesis y variables intermedias cuando una condición puede prestarse a confusión.
En el próximo tema estudiaremos las tablas de verdad.