Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Regla 0x100Eh: Delimitación obligatoria con bloque de llaves en lazos do-while

Estructuras de control y flujo (0x10XX)

Universidad Nacional de Río Negro

0x100Eh: Delimitación obligatoria con bloque de llaves en lazos do-while

Enunciado normativo

Todo lazo do ... while DEBE 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 consecuenciaEfecto concreto
Confusión sintácticaEl while final parece un lazo aparte.
Bug lógicoAgregar una sentencia al “cuerpo” la deja fuera del do.
EstiloSe aparta de la convención Allman de 0x0007h: Las llaves deben ubicarse en líneas independientes según el estilo Allman.
RevisiónEl 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

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

Cómo detectarla

HerramientaComandoSeñal
gaffgaff check archivo.cRegla 0x100Eh: do sin llaves.
gccgcc -Wall -Wextra -Wmisleading-indentationPuede avisar de indentación engañosa.
Revisión manualdo cuyo cuerpo no empieza con {.

Checklist de autocontrol

Reglas relacionadas