Regla 0x100Fh: Prohibición de cláusula else redundante tras sentencia de retorno anticipado
Estructuras de control y flujo (0x10XX)
0x100Fh: Prohibición de cláusula else redundante tras sentencia de retorno anticipado¶
Enunciado normativo¶
Si la rama de un
ifconcluye incondicionalmente conreturn,break,continueoexit, NO DEBE escribirse la cláusulaelseposterior. Las sentencias de la rama alterna DEBEN desanidarse al nivel de la estructura.
¿Por qué existe esta regla?¶
El problema¶
El else posterior a un retorno nunca aporta semántica: si se ejecutó el
return, el else no se alcanza; si no se ejecutó, el else se ejecuta
porque es lo que sigue. El else solo agrega un nivel de indentación que
empuja el camino principal a la derecha.
Desanidar mantiene el “camino feliz” al ras del margen y reduce la profundidad del código. Cada nivel de indentación es una condición que el lector debe recordar; eliminarlo libera memoria de trabajo.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Anidamiento innecesario | El camino principal queda corrido a la derecha. |
| Legibilidad | Se lee como si ambas ramas pudieran continuar. |
| Mantenibilidad | Agregar pasos al camino feliz exige mantener la indentación. |
Fundamento en el estándar y en la cátedra¶
El estándar C no prohíbe el else; la regla es de diseño. La cátedra se apoya
en las cláusulas de guarda y los retornos anticipados de 0x2001h: Las funciones deben usar cláusulas de guarda y retornos anticipados para reducir la anidación profunda, y en el
antipatrón de bloques else superfluos 0x2013h: Detector de bloques else superfluos tras sentencias terminales. Tensión documentada:
0x200Ch: Cada función debe tener a lo sumo un return pide un único return; cuando rija esa regla, se puede
desanidar con una variable de resultado en lugar de retornos múltiples.
Alcance y excepciones¶
Aplica cuando la rama
iftermina siempre en una salida incondicional.Si el
ifpuede terminar sin salir (por ejemplo, unifinterno sinelse), elelseexterno puede ser necesario.No aplica a cadenas
else if: ahí elelseencadena una nueva condición.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — else tras return¶
if (error)
{
return -1;
}
else
{
procesar_exito();
return 0;
}Por qué falla: el else solo agrega un nivel. El camino exitoso bien podría
estar al ras, sin la condición negativa pendiente.
❌ Contraejemplo 2 — else tras continue¶
for (size_t i = 0; i < n; i++)
{
if (valores[i] < 0)
{
continue;
}
else
{
suma += valores[i];
}
}Por qué falla: el else es innecesario porque el continue ya cortó la rama.
Además, el continue está prohibido por 0x1002h: Restringí el uso de break y continue; preferí lazos con bandera de control; conviene reescribir la
condición.
✅ Ejemplo conforme 1 — flujo desanidado¶
if (error)
{
return -1;
}
procesar_exito();
return 0;El camino principal queda al margen y la guarda if (error) se lee como una
salida temprana.
✅ Ejemplo conforme 2 — validación con guarda¶
bool procesar(const char *nombre)
{
if (nombre == NULL)
{
return false;
}
ejecutar(nombre);
return true;
}La condición de error sale temprano y el camino feliz no acumula else ni
indentación (ver 0x2001h: Las funciones deben usar cláusulas de guarda y retornos anticipados para reducir la anidación profunda).
⚠️ Casos límite¶
else if: no es unelseredundante; encadena una condición distinta y se conserva.Regla de único
return: si 0x200Ch: Cada función debe tener a lo sumo un return está activa, reemplazar por una variableresultadoy una sola salida.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Regla 0x100Fh: else redundante. |
gcc | gcc -Wall -Wextra | No la detecta; es una regla de diseño. |
| Revisión manual | — | if (...) { return; } else { ... }. |
Checklist de autocontrol¶
¿La rama
iftermina siempre conreturn,break,continueoexit?Si es así, ¿eliminé el
elsey desanidé?¿Distinguí los
else iflegítimos de loselseredundantes?
Reglas relacionadas¶
0x2001h: Las funciones deben usar cláusulas de guarda y retornos anticipados para reducir la anidación profunda — cláusulas de guarda y retornos anticipados.
0x2013h: Detector de bloques else superfluos tras sentencias terminales — bloques
elsesuperfluos tras sentencias terminales.0x200Ch: Cada función debe tener a lo sumo un return — tensión: un único
returnpuede exigir otra estructura.