Regla 0x100Eh: Delimitación obligatoria con bloque de llaves en lazos do-while
Estructuras de control y flujo (0x10XX)
0x100Eh: Delimitación obligatoria con bloque de llaves en lazos do-while¶
Enunciado normativo¶
Todo lazo
do ... whileDEBE encerrar su cuerpo entre llaves explícitas{ ... }, aunque contenga una única sentencia.
¿Por qué existe esta regla?¶
El problema¶
La sintaxis do sentencia while (condicion); permite un cuerpo de una sola
sentencia sin llaves. El problema es que do y while son dos palabras clave
separadas: sin llaves, el lector (y el autor) puede perder de vista dónde
termina el cuerpo y cuál es la condición. En particular, un while suelto
parece un lazo independiente cuando en realidad cierra el do.
Las llaves delimitan el cuerpo de forma inequívoca. Esta regla es la aplicación
de 0x1001h: Todas las estructuras de control deben utilizar llaves al caso particular del do-while, que por su forma de dos
palabras es el más propenso a confusión.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Confusión sintáctica | El while final parece un lazo aparte. |
| Bug lógico | Agregar una sentencia al “cuerpo” la deja fuera del do. |
| Estilo | Se aparta de la convención Allman de 0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman. |
| Revisión | El corrector debe reconstruir el alcance del do. |
Fundamento en el estándar y en la cátedra¶
ISO/IEC 9899:2011 §6.8.5.2 define el do-while; su cuerpo es una sentencia y
la condición se evalúa después. La cátedra generaliza la obligación de llaves de
0x1001h: Todas las estructuras de control deben utilizar llaves a todos los lazos, incluido este, y mantiene el estilo Allman.
La misma lógica de seguridad aplica a 0x100Ah: Prohibición de estructuras de control con cuerpo vacío (if (...);).
Alcance y excepciones¶
Aplica a todo
do-while, con una o varias sentencias.No hay excepción por cuerpo de una línea.
El
;final de} while (cond);es obligatorio y no debe olvidarse.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — do sin llaves¶
do x++; while (x < 10);Por qué falla: no se distingue de un while suelto con una sentencia previa.
Si mañana se agrega registrar(x);, hay que recordar envolver todo con llaves
o la sentencia nueva queda fuera del lazo.
❌ Contraejemplo 2 — do con cuerpo aparente de dos sentencias¶
do
x++;
registrar(x);
while (x < 10);Por qué falla: solo x++ forma el cuerpo del do; registrar(x) se ejecuta
una vez al salir del lazo, aunque la indentación sugiera lo contrario.
✅ Ejemplo conforme 1 — llaves obligatorias¶
do
{
x++;
} while (x < 10);El cuerpo está delimitado y el while final se reconoce como la condición del
do, no como un lazo nuevo.
✅ Ejemplo conforme 2 — cuerpo de varias sentencias¶
int opcion;
do
{
mostrar_menu();
opcion = leer_opcion();
procesar(opcion);
} while (opcion != SALIR);Las llaves agrupan las tres sentencias del cuerpo y dejan visible que el corte ocurre después de procesar la opción.
⚠️ Casos límite¶
do-whilede una sola sentencia: igual lleva llaves.whileanidado dentro deldo: las llaves deldoexteriores evitan confundir ambos cierres.Olvido del
;:} while (cond)sin;no compila; no es una excepción.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Regla 0x100Eh: do sin llaves. |
gcc | gcc -Wall -Wextra -Wmisleading-indentation | Puede avisar de indentación engañosa. |
| Revisión manual | — | do cuyo cuerpo no empieza con {. |
Checklist de autocontrol¶
¿Todo
doabre su cuerpo con{?¿El
whilede cierre se distingue claramente del cuerpo?¿Está el
;final después de la condición?¿Agregar una sentencia al cuerpo queda dentro de las llaves?
Reglas relacionadas¶
0x1001h: Todas las estructuras de control deben utilizar llaves — regla general de llaves obligatorias en estructuras de control.
0x1003h: Utilizá el lazo for para iteraciones con rango o contador definido y while para lazos controlados por condiciones lógicas — cuándo conviene
do-whilefrente awhile.0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman — estilo Allman para la ubicación de las llaves.